在 Python 中查找 3 个点之间的角度问题
Issue with finding angle between 3 points in Python
我有 3 个点 p1(x1, y1), p2(x2, y2) 和 p3(x3, y3)。我正在尝试计算这 3 个点之间的 angle(在 anti-clockwise 方向)。我正在使用多个博客和 SE 网站(如 this)中提供的以下点积方法。
def angle_between(p1, p2, p3):
x1, y1 = p1
x2, y2 = p2
x3, y3 = p3
v21 = (x1 - x2, y1 - y2)
v23 = (x3 - x2, y3 - y2)
dot = v21[0] * v23[0] + v21[1] * v23[1]
det = v21[0] * v23[1] - v21[1] * v23[0]
theta = np.rad2deg(np.arctan2(det, dot))
print(theta)
它为任何不在直线上的点提供了正确的角度。例如
p1 = (0, 0)
p2 = (1, 0)
p3 = (1, 1)
angle_between(p1, p2, p3) # Prints -90
angle_between(p3, p2, p1) # Prints +90
但是,如果点在直线上,它会给出相同的答案
p1 = (0, 0)
p2 = (1, 0)
p3 = (2, 0)
angle_between(p1, p2, p3) # Prints +180
angle_between(p3, p2, p1) # Prints +180
这里我期望 (p3, p2, p1) 给出 -180。我在这里错过了什么?如果我使用的方法不正确,有人可以帮我指出正确的方法吗?
我曾尝试使用正余弦定律(如给定的那样 here),但它只提供角度而没有任何方向感。
查看此解决方案。它始终提供 正 角度,以逆时针方向测量:
from math import atan2, degrees
def angle_between(p1, p2, p3):
x1, y1 = p1
x2, y2 = p2
x3, y3 = p3
deg1 = (360 + degrees(atan2(x1 - x2, y1 - y2))) % 360
deg2 = (360 + degrees(atan2(x3 - x2, y3 - y2))) % 360
return deg2 - deg1 if deg1 <= deg2 else 360 - (deg1 - deg2)
我有 3 个点 p1(x1, y1), p2(x2, y2) 和 p3(x3, y3)。我正在尝试计算这 3 个点之间的 angle(在 anti-clockwise 方向)。我正在使用多个博客和 SE 网站(如 this)中提供的以下点积方法。
def angle_between(p1, p2, p3):
x1, y1 = p1
x2, y2 = p2
x3, y3 = p3
v21 = (x1 - x2, y1 - y2)
v23 = (x3 - x2, y3 - y2)
dot = v21[0] * v23[0] + v21[1] * v23[1]
det = v21[0] * v23[1] - v21[1] * v23[0]
theta = np.rad2deg(np.arctan2(det, dot))
print(theta)
它为任何不在直线上的点提供了正确的角度。例如
p1 = (0, 0)
p2 = (1, 0)
p3 = (1, 1)
angle_between(p1, p2, p3) # Prints -90
angle_between(p3, p2, p1) # Prints +90
但是,如果点在直线上,它会给出相同的答案
p1 = (0, 0)
p2 = (1, 0)
p3 = (2, 0)
angle_between(p1, p2, p3) # Prints +180
angle_between(p3, p2, p1) # Prints +180
这里我期望 (p3, p2, p1) 给出 -180。我在这里错过了什么?如果我使用的方法不正确,有人可以帮我指出正确的方法吗?
我曾尝试使用正余弦定律(如给定的那样 here),但它只提供角度而没有任何方向感。
查看此解决方案。它始终提供 正 角度,以逆时针方向测量:
from math import atan2, degrees
def angle_between(p1, p2, p3):
x1, y1 = p1
x2, y2 = p2
x3, y3 = p3
deg1 = (360 + degrees(atan2(x1 - x2, y1 - y2))) % 360
deg2 = (360 + degrees(atan2(x3 - x2, y3 - y2))) % 360
return deg2 - deg1 if deg1 <= deg2 else 360 - (deg1 - deg2)