计算两点之间的角度,其中包括反向Y轴

29
我正在使用javascript/canvas创建一个简单的2D游戏。 我需要找出某个对象相对于我的位置的角度。
例如:假设我在(10,10),而对象在(10,5) - 这将导致90度(因为正Y向下,负Y向上)(10,10)与(10,15)之间的角度为270度。
我该如何解决这个问题?

从哪个角度看? - Christopher Creutzig
我有点困惑你是如何确定角度的...你是否一直面向着某个方向? - rownage
@rownage:除非我误解了,否则重点是确定从一个位置指向另一个位置的向量的方向。 - Tim Goodman
@Tim:是的,我在那里感到困惑,看到KennyTM的回答后才明白发生了什么(没有比一个好答案更能帮助理解问题的了)。 - rownage
4个回答

40
假设你在点(a,b),而物体在点(c,d)。那么物体相对于你的位置是(x,y)=(c-a,d-b)。
然后,您可以使用 Math.atan2() 函数获取弧度角。
var theta = Math.atan2(-y, x);

请注意,结果的范围为[-π, π]。如果您需要非负数,则需要添加。
if (theta < 0)
   theta += 2 * Math.PI;

将弧度转换为角度,乘以180 / Math.PI


6
如果您的坐标是(xMe,yMe),他们的坐标是(xThem,yThem),那么您可以使用以下公式: arctan((yMe-yThem)/(xThem-xMe)) 通常应该是arctan((yThem-yMe)/(xThem-xMe)), 但在这种情况下,y轴的符号被反转。 要将结果从弧度转换为度,请乘以180/pi。 因此,在JavaScript中,它看起来像这样:Math.atan((yThem-yMe)/(xThem-xMe))*180/Math.PI atan给出一个值介于-pi/2和pi/2之间(即介于-90度和90度之间)。但是,您可以查看(xThem - xMe, yMe - yThem)向量所处的象限并进行相应的调整。

2
我实际上更喜欢KennyTM的答案。Math.atan2已经知道你在哪个象限,所以你可以省略最后一步。 - Tim Goodman
我仍然觉得这个答案很有用,因为它是一个不错的选择,我想自己控制象限。 - Partack
pi/2是180度,而不是90度。 - Jason Boyd
@JasonBoyd 你错了。π弧度=180度。一个完整的圆是2π弧度。 - Tim Goodman
好的。当我沉浸在编码时,我对数学变得有些模糊了。 - Jason Boyd

4
通俗易懂地说:
function pointDirection(x1, y1, x2, y2) {
    return Math.atan2(y2 - y1, x2 - x1) * 180 / Math.PI;
}

1
在HTML5画布中,原点位于左上角,因此y轴从上向下增长。所以无论你在单位圆上的哪个位置,要计算点A到中心(C)的角度,实际上应该这样做:

angle = Math.atan2(Cy-Ay,Ax-Cx)

你将得到[-π, π]范围内的结果。

我不知道为什么他们没有将画布原点设为左下角。


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