【问题标题】:Issue with finding angle between 3 points in Python在 Python 中找到 3 个点之间的角度的问题
【发布时间】:2019-11-20 22:39:56
【问题描述】:

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

【问题讨论】:

  • 在第二种情况下,点是共线的。您的代码正在生成正确的 o/p。
  • 如果你得到的是逆时针方向的角度,那么为什么角度的符号很重要?
  • @hhaefliger,那么我将如何区分最后一种情况?即当点在直线上时。
  • 另外,看看这个解决方案:stackoverflow.com/questions/31630946/…

标签: python-3.x numpy angle


【解决方案1】:

查看此解决方案。它总是提供角,按逆时针方向测量:

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)

【讨论】:

  • 感谢您的回答。 +1。但是,当 3 个点在同一条线上时,我仍然无法区分大小写。当 3 个点以相反的顺序解析时,我期望给它负号。这是有道理的还是我对这种情况的理解存在逻辑上的差距?
  • 我认为你误会了。试着画三个点。然后测量逆顺方向的角度,从第一段 (p1,p2) 开始,到达第二段 (p2,p3)。如果这些线段在同一条线上,则角度始终为 180!
  • 我想我明白了。感谢你付出的努力。我现有的功能只给出正确答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多