python 中三点之间的角度 - 为什么会出现这个结果?
Angle between three points in python - Why this result?
我试图计算点 A、B 和 C 之间的角度 ABC。我知道数学很基础,但我不明白为什么我的函数给出了错误的结果。首先,这是代码(a
包含一个列表 [x, y, z]
)
def angle(a, b, c):
# Create vectors from points
ba = [a[0] - b[0], a[1] - b[1], a[2] - b[2]]
bc = [c[0] - b[0], c[1] - b[1], c[2] - b[2]]
# Normalize vector
nba = sqrt(ba[0]**2 + ba[1]**2 + ba[2]**2)
ba = [ba[0]/nba, ba[1]/nba, ba[2]/nba]
nbc = sqrt(bc[0]**2 + bc[1]**2 + bc[2]**2)
bc = [bc[0]/nbc, bc[1]/nbc, bc[2]/nbc]
# Calculate scalar from normalized vectors
scal = ba[0]*bc[0] + ba[1]*bc[1] + ba[2]*bc[2]
# calculate the angle in radian
angle = acos(scal)
这个函数给出了错误的结果。事实上,如果我将第二个向量从 bc
更改为 cb
:
cb = [b[0]-c[0], b[1]-c[1], b[2]-c[2]]
我不明白为什么,就像我遵循数学一样,我的第一个解决方案应该运行良好并给出好的结果...
首先,您的代码非常非 Pythonic。这里有一个建议:
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) 传递到 returns 角度。
我试图计算点 A、B 和 C 之间的角度 ABC。我知道数学很基础,但我不明白为什么我的函数给出了错误的结果。首先,这是代码(a
包含一个列表 [x, y, z]
)
def angle(a, b, c):
# Create vectors from points
ba = [a[0] - b[0], a[1] - b[1], a[2] - b[2]]
bc = [c[0] - b[0], c[1] - b[1], c[2] - b[2]]
# Normalize vector
nba = sqrt(ba[0]**2 + ba[1]**2 + ba[2]**2)
ba = [ba[0]/nba, ba[1]/nba, ba[2]/nba]
nbc = sqrt(bc[0]**2 + bc[1]**2 + bc[2]**2)
bc = [bc[0]/nbc, bc[1]/nbc, bc[2]/nbc]
# Calculate scalar from normalized vectors
scal = ba[0]*bc[0] + ba[1]*bc[1] + ba[2]*bc[2]
# calculate the angle in radian
angle = acos(scal)
这个函数给出了错误的结果。事实上,如果我将第二个向量从 bc
更改为 cb
:
cb = [b[0]-c[0], b[1]-c[1], b[2]-c[2]]
我不明白为什么,就像我遵循数学一样,我的第一个解决方案应该运行良好并给出好的结果...
首先,您的代码非常非 Pythonic。这里有一个建议:
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) 传递到 returns 角度。