我正在用 javascript/canvas 创建一个简单的 2D 游戏。我需要弄清楚某个物体相对于我的位置的角度。
所以:假设我在(10,10)并且对象在(10,5) - 这将导致90度(正Y向下,负Y向上)(10,10)与(10, 15) 将是 270 度。
我该怎么办?
我正在用 javascript/canvas 创建一个简单的 2D 游戏。我需要弄清楚某个物体相对于我的位置的角度。
所以:假设我在(10,10)并且对象在(10,5) - 这将导致90度(正Y向下,负Y向上)(10,10)与(10, 15) 将是 270 度。
我该怎么办?
假设你在 (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
.
如果您的坐标是 (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) 向量所在的象限并进行相应调整。
通俗地说:
function pointDirection(x1, y1, x2, y2) {
return Math.atan2(y2 - y1, x2 - x1) * 180 / Math.PI;
}
在 HTML5 画布中,原点是左上角,因此 y 轴从上到下增长。因此,无论您在单位圆上的哪个位置计算点 A 到中心 (C) 的角度,您实际上都应该这样做
angle = Math.atan2(Cy-Ay,Ax-Cx)
你会得到在 [-π, π] 范围内的结果。
我不知道他们为什么没有将画布原点设为左下角。