python - 两条线之间的角度并不总是有效
问题描述
使用此代码
# 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
解决方案
对于示例 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 度的补数。
因此,这与其说是糟糕的公式,不如说是糟糕的参数传递和检查以获得正角或负角。
推荐阅读
- cucumber - Gherkin:带有双引号元素的字符串的步骤定义
- json - package.json 出错
- c# - 无法使用 LINQ 更新列表
- javascript - 在 textarea/contenteditable div 中添加带有“添加文件”的图像
- awk - 使用 Gnu AWK 检索匹配的正则表达式记录分隔符
- gravity-forms-plugin - 在 Gravity 表单上提交表单后计算的数字字段返回 0
- java - java.util.HashSet 中的映射如何变为空
- c# - SSH连接中的ssh连接与c#
- python - 用Numpy从文本文件中读取三乘三点的坐标?
- c# - 以 ViewModel 作为属性的 Wpf 数据绑定