首页 > 解决方案 > 两条线之间的角度并不总是有效

问题描述

我正在计算下图中两条线之间的角度 在此处输入图像描述

使用此代码

# the lines are in the format (x1, y1, x2, y2)
def getAngle(line_1, line_2):
    angle1 = math.atan2(line_1[1] - line_1[3], line_1[0] - line_1[2])
    angle2 = math.atan2(line_2[1] - line_2[3], line_2[0] - line_2[2])

    result = math.degrees(abs(angle1 - angle2))
    if result < 0:
        result += 360

    return result

现在该函数在两条红线(几乎在彼此之上)以及红线和绿线之间起作用。然而,在红线和蓝线之间,函数返回 239.1083,而它应该是 ~300。由于它在某些情况下有效,而在其他情况下无效,我不确定问题出在哪里。

一些示例输入和输出:

getAngle((316,309,316,-91), (316,309,421,209)) = 46.3971 # working
getAngle((316,309,316,-91), (199,239,316,309)) = 239.108 # should be around 300

标签: python

解决方案


对于示例 getAngle((316,309,316,-91), (199,239,316,309)),在这种情况下,罪魁祸首是角度的测量。

角度正在计算正 X 轴。您在此处定义的角度计算的是下图中给定图像中的 phi,而不是您应该期待的 theta。由于旋转本质上是负的(观察 phi 的箭头),因此任何后续计算都必须确保正旋转,而不是负旋转。否则,您将大致短于互补角。

在给定的示例中,line2 的正确角度应该是大约 +210 度,或大约 -150 度。类似地,line1 的角度可以是 +90 度或 -90 度。现在,一切都在游戏中添加或减去哪些以及如何?

  • 239.something,姑且称之为 240 是通过 abs(90-(-150)) 得到的

  • abs(-90 - (+210)) 得到你期望的 300。

60 度的差值是 theta = 30 度的补数。

因此,这与其说是糟糕的公式,不如说是糟糕的参数传递和检查以获得正角或负角。

图片2 图片1


推荐阅读