python中三个点之间的角度-为什么会出现这种结果?
我试着计算点A、B和C之间的角度ABC。我知道数学很基本,但我不明白为什么我的函数给出了错误的结果。首先,这里是代码(python中三个点之间的角度-为什么会出现这种结果?,python,math,angle,Python,Math,Angle,我试着计算点A、B和C之间的角度ABC。我知道数学很基本,但我不明白为什么我的函数给出了错误的结果。首先,这里是代码(a包含一个列表[x,y,z]) 此函数给出错误的结果。事实上,如果我将第二个向量从bc更改为cb,它会给出很好的结果: cb = [b[0]-c[0], b[1]-c[1], b[2]-c[2]] 我不明白为什么,就像我学数学一样,我的第一个解决方案应该能很好地工作,并给出好的结果 首先,您的代码非常不符合Python。这里有一个建议: from math import
a
包含一个列表[x,y,z]
)
此函数给出错误的结果。事实上,如果我将第二个向量从bc
更改为cb
,它会给出很好的结果:
cb = [b[0]-c[0], b[1]-c[1], b[2]-c[2]]
我不明白为什么,就像我学数学一样,我的第一个解决方案应该能很好地工作,并给出好的结果 首先,您的代码非常不符合Python。这里有一个建议:
from math import sqrt, acos
def angle(a, b, c):
# Create vectors from points
ba = [ aa-bb for aa,bb in zip(a,b) ]
bc = [ cc-bb for cc,bb in zip(c,b) ]
# Normalize vector
nba = sqrt ( sum ( (x**2.0 for x in ba) ) )
ba = [ x/nba for x in ba ]
nbc = sqrt ( sum ( (x**2.0 for x in bc) ) )
bc = [ x/nbc for x in bc ]
# Calculate scalar from normalized vectors
scalar = sum ( (aa*bb for aa,bb in zip(ba,bc)) )
# calculate the angle in radian
angle = acos(scalar)
return angle
其次,您的代码可能返回了正确的角度,但可能不是您期望的角度
假设出现这种情况:
A-----C
| /
| /
| /
| /
|/
B
你正在计算的角度是B处的底角,而不是A处的左上角,这通常是人们在将三个向量(A、B、c)传递到返回角度的函数中时想要的角度。首先,你的代码非常不符合Python。这里有一个建议:
from math import sqrt, acos
def angle(a, b, c):
# Create vectors from points
ba = [ aa-bb for aa,bb in zip(a,b) ]
bc = [ cc-bb for cc,bb in zip(c,b) ]
# Normalize vector
nba = sqrt ( sum ( (x**2.0 for x in ba) ) )
ba = [ x/nba for x in ba ]
nbc = sqrt ( sum ( (x**2.0 for x in bc) ) )
bc = [ x/nbc for x in bc ]
# Calculate scalar from normalized vectors
scalar = sum ( (aa*bb for aa,bb in zip(ba,bc)) )
# calculate the angle in radian
angle = acos(scalar)
return angle
其次,您的代码可能返回了正确的角度,但可能不是您期望的角度
假设出现这种情况:
A-----C
| /
| /
| /
| /
|/
B
你正在计算的角度是B处的底角,而不是A处的左上角,这通常是人们在将三个向量(A、B、c)传递到返回角度的函数中时想要的角度。首先,你的代码非常不符合Python。这里有一个建议:
from math import sqrt, acos
def angle(a, b, c):
# Create vectors from points
ba = [ aa-bb for aa,bb in zip(a,b) ]
bc = [ cc-bb for cc,bb in zip(c,b) ]
# Normalize vector
nba = sqrt ( sum ( (x**2.0 for x in ba) ) )
ba = [ x/nba for x in ba ]
nbc = sqrt ( sum ( (x**2.0 for x in bc) ) )
bc = [ x/nbc for x in bc ]
# Calculate scalar from normalized vectors
scalar = sum ( (aa*bb for aa,bb in zip(ba,bc)) )
# calculate the angle in radian
angle = acos(scalar)
return angle
其次,您的代码可能返回了正确的角度,但可能不是您期望的角度
假设出现这种情况:
A-----C
| /
| /
| /
| /
|/
B
你正在计算的角度是B处的底角,而不是A处的左上角,这通常是人们在将三个向量(A、B、c)传递到返回角度的函数中时想要的角度。首先,你的代码非常不符合Python。这里有一个建议:
from math import sqrt, acos
def angle(a, b, c):
# Create vectors from points
ba = [ aa-bb for aa,bb in zip(a,b) ]
bc = [ cc-bb for cc,bb in zip(c,b) ]
# Normalize vector
nba = sqrt ( sum ( (x**2.0 for x in ba) ) )
ba = [ x/nba for x in ba ]
nbc = sqrt ( sum ( (x**2.0 for x in bc) ) )
bc = [ x/nbc for x in bc ]
# Calculate scalar from normalized vectors
scalar = sum ( (aa*bb for aa,bb in zip(ba,bc)) )
# calculate the angle in radian
angle = acos(scalar)
return angle
其次,您的代码可能返回了正确的角度,但可能不是您期望的角度
假设出现这种情况:
A-----C
| /
| /
| /
| /
|/
B
您计算的角度是B处的底角,而不是A处的左上角,这通常是人们在将三个向量(A、B、c)传递到返回角度的函数中时所需要的角度。我看不出此代码有任何问题–输入和预期输出是什么?你描述的改变修正了它给出的πθ(如果θ是你想要的角度)。好的,我想问题是我在寻找向量ba和bc之间的角度,但它不是这样工作的。我必须得到ab和bc之间的角度才能得到ABC。我看不出这个代码有任何问题——输入和预期输出是什么?你描述的改变修正了它给出的πθ(如果θ是你想要的角度)。好的,我想问题是我在寻找向量ba和bc之间的角度,但它不是这样工作的。我必须得到ab和bc之间的角度才能得到ABC。我看不出这个代码有任何问题——输入和预期输出是什么?你描述的改变修正了它给出的πθ(如果θ是你想要的角度)。好的,我想问题是我在寻找向量ba和bc之间的角度,但它不是这样工作的。我必须得到ab和bc之间的角度才能得到ABC。我看不出这个代码有任何问题——输入和预期输出是什么?你描述的改变修正了它给出的πθ(如果θ是你想要的角度)。好的,我想问题是我在寻找向量ba和bc之间的角度,但它不是这样工作的。我必须得到ab和bc之间的角度才能得到ABC。我想你错过了一些
sqrt
调用。你忘记了sqrt
要标准化的sum
。无论如何,我将进一步定义一个normalize函数,以避免两次键入逻辑,并使用scal=sum(aa*bb代表aa,bb在zip中(normalize(b,a),normalize(b,c))
Oops调用它。是的,忘了。我尽量不偏离他的原始代码,所以我没有在函数中分离它们。实际上,他应该只使用numpy。我认为你错过了一些sqrt
调用。你忘记了sqrt
要标准化的平方和。无论如何,我将进一步定义一个normalize函数,以避免两次键入逻辑,并使用scal=sum(aa*bb代表aa,bb在zip中(normalize(b,a),normalize(b,c))
Oops调用它。是的,忘了。我尽量不偏离他的原始代码,所以我没有在函数中分离它们。实际上,他应该只使用numpy。我认为你错过了一些sqrt
调用。你忘记了sqrt
要标准化的平方和。无论如何,我将进一步定义一个normalize函数,以避免两次键入逻辑,并使用scal=sum(aa*bb代表aa,bb在zip中(normalize(b,a),normalize(b,c))
Oops调用它。是的,忘了。我尽量不偏离他的原始代码,所以我没有在函数中分离它们。实际上,他应该只使用numpy。我认为你错过了一些sqrt
调用。你忘记了sqrt
要标准化的平方和。无论如何,我将进一步定义一个normalize函数,以避免两次键入逻辑,并使用scal=sum(aa*bb代表aa,bb在zip中(normalize(b,a),normalize(b,c))
Oops调用它。是的,忘了。我尽量不偏离他的原始代码,所以我没有在函数中分离它们。事实上,他应该只使用numpy。