两点之间的角度,0-360,顺时针方向。

5
如何找到点(在下图中为0.3,-0.17)与原点(0,0)之间的角度(顺时针旋转,范围为0到360度)?以下是我需要的大致示意图:

custom atanfull

左边的圆仅用于显示我希望角度旋转的方向,以及它们的起始/结束位置。右边的图示给出了我将提供给代码的输入示例(即0.3,-0.17)。绿线表示结果角度。
如何在C++或JavaScript中找到上述描述的两点之间的角度?

10
这个问题似乎与解析几何无关,因此属于非主题范围。 - talonmies
3
我对此是否不相关没有意见,但通常我发现数学交换平台的人对提问者的技能水平非常包容。如果您要求他们这样做,我认为他们会用简单的术语解释它(或者至少提供解释他们正在使用的奇特符号的链接)。 - Kevin
1
https://dev59.com/GnM_5IYBdhLWcg3w0238#1211243 - Lance Roberts
2
可能是重复问题:*计算两个向量之间顺时针角度的直接方法* - Peter Mortensen
2
请展示一下您已经编写的代码。 - Rohit Gupta
显示剩余3条评论
2个回答

27

atan2 函数根据点的 x 和 y 坐标给出该点相对于 X 轴的角度。结果通常在 -180 到 180 度之间,但我们可以稍后将其调整为 [0, 360]。

您可以通过减去它们的 atan 结果来找到从原点延伸的两条线 A 和 B 之间的角度:

angle = atan2(a.y, a.x) - atan2(b.y, b.x);

这里,你的A点将是(0,1),而B点将是(0.3,-0.17)。

atan2通常返回弧度而不是角度(请检查您所使用的编程语言文档以确保)。如果是这种情况,您应该在此处将其转换为角度。

angle = angle * 360 / (2*pi);

angle 现在将会在 -360 到 360 度之间,因此您需要执行额外的检查以使其处于所需范围内。

if (angle < 0){
    angle = angle + 360;
}

在这里想要注意的是,在ArcGIS中,当比较线的FromPoint和ToPoint以获取其完整的360度角度时,我不得不添加一个检查。我添加了以下内容: if (startX > endX) { angle += 180; if (angle > 360) { angle -= 360; } } - Josh P

1
如果您将图像沿对角线翻转,即交换x和y坐标,则角度分布符合三角学的通常规律。因此,
angle_in_degrees=atan2(x,y)*180/pi

如果您不想使用[-180°..180°]的范围,请添加任何更正内容。

(请注意, atan2 参数通常为(y,x)顺序,但此处我们正在交换它们。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接