28

我正在用 javascript/canvas 创建一个简单的 2D 游戏。我需要弄清楚某个物体相对于我的位置的角度。

所以:假设我在(10,10)并且对象在(10,5) - 这将导致90度(正Y向下,负Y向上)(10,10)与(10, 15) 将是 270 度。

我该怎么办?

4

4 回答 4

39

假设你在 (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.

于 2010-07-22T14:01:17.273 回答
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) 向量所在的象限并进行相应调整。

于 2010-07-22T14:01:19.843 回答
4

通俗地说:

function pointDirection(x1, y1, x2, y2) {
    return Math.atan2(y2 - y1, x2 - x1) * 180 / Math.PI;
}
于 2015-06-23T08:10:16.490 回答
1

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

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

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

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

于 2016-11-27T15:22:53.827 回答