atan2
函数实现。从a = ax + i * ay
到b = bx + i * by
的角度是a
共轭乘以b
的参数(将b
按a
的角度向后旋转,不考虑比例),在坐标系中为:(ax-i*ay) * (bx+i*by) = ax*bx+ay*by + i*(ax*by-ay*bx)
atan2( ax*by-ay*bx, ax*bx+ay*by ).
acos +点积
,然后构造旋转向量进行CW / CCW检查并根据需要纠正结果角度。 - Spektreatan2
的问题在于,如果你想象向量 a
是静态的,而向量 b
逆时针旋转,你会看到返回值从 0 到 π 变化,但突然变为负数并从 -π 到 0 进行,如果你对一个从 0 到 2π 增加的角度感兴趣,这不是很好。
为了解决这个问题,下面的函数方便地将结果从 atan2
映射,并返回一个值,该值在 0 到 2π 之间,正如人们所期望的那样:
const TAU = Math.PI * 2;
/**
* Gives the angle in radians from vector a to vector b in anticlockwise direction,
* ranging from 0 to 2π.
*
* @param {Vector} a
* @param {Vector} b
* @returns {Number}
*/
static angle(a, b) {
let angle = Math.atan2(a.x * b.y - a.y * b.x, a.x * b.x + a.y * b.y);
if (angle < 0) {
angle += TAU;
}
return angle;
}
这个项目使用JavaScript编写,但是可以轻松移植到其他编程语言中。
atan2( ax*by-ay*bx, ax*bx+ay*by ) % (PI*2)
计算可以得到完整逆时针弧度的值。
(360 + angle) MOD 360
(或2 * PI,如果您的答案以弧度表示)。 - D Stanleygreen_angle = 360 + red_angle = (360 + red_angle) MOD 360
。如果你的答案是正数(比如purple_angle),那么(360+purple_angle) MOD 360
仍将给出purple_angle。因此,它适用于所有情况(正数或负数)。 - D Stanley