在Python中发现3个点之间的夹角的问题

问题描述 投票:0回答:1

我有3个点p1(x1,y1),p2(x2,y2)和p3(x3,y3)。我正在尝试计算这3个点之间的angle(沿逆时针方向)。我正在使用以下在多个博客和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,但它仅提供了我的角度,而没有角度的方向感。

python-3.x numpy angle
1个回答
1
投票

查看此解决方案。它始终提供沿逆时针方向测量的positive角度:

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)
© www.soinside.com 2019 - 2024. All rights reserved.