(X, Y) = R * (cos θ, sin θ)
假设物体具有笛卡尔坐标P1,P2
。引入2D叉积:
A ^ B = Ax By - Ay Bx
如果A相对于B顺时针旋转,则结果为正,反之亦然。W1,W2
,其中正号表示按照极坐标惯例逆时针旋转。P1 ^ P2 < 0
)时:
W1,W2 > 0
且W2 > W1
W1,W2 < 0
且-W1 > -W2
W1 < 0
且W2 > 0
sign(W1 - W2) == sign(P1 ^ P2) != 0
顺便说一下,使用三角恒等式可以得到P1 ^ P2 = R^2 sin(θ2 - θ1)
,因此仅检查sin(θ2 - θ1)
的符号即可。sign(P1 ^ P2) = sign(180 - [θ2 - θ1] % 360)
sign(W1 - W2) == sign(P1 ^ P2) != 0
- 替换第二项即可。 - meowgoesthedogsign
和 sin
是不同的函数。3)sign(P1 ^ P2)
是笛卡尔坐标(而非极角)的叉积的符号。我已经在我的答案中定义了从角度到笛卡尔坐标的转换。 - meowgoesthedogSIGN((p2V - p1V) * Angle) = (+ if separating, - when closing or approaching)
return ((p2V - p1V) * angle) > 0 ? 1 : -1;
如果使用的是有符号的夹角,当p2相对于p1逆时针(左侧)时为正,而当p2相对于p1顺时针(右侧)时为负,则此方法效果良好。
将参考系移动到p1
。现在你有一个静态点p1
和以速度p2V - p1V
从位置p2-p1
开始移动的p2
。现在的问题是:什么时候p2
会撞到原点?
不幸的是,这里有三种情况,取决于p2V - p1V
的符号:
p2
将绕圆圈走并击中360度。p2
将直接走向原点并击中0度。唯一需要注意的是正确计算p2 - p1
的初始位置。我建议假设初始位置在0到359之间,然后相应地调整p2 - p1
(如果为负,则加上360)。基本上,计算所有内容“模360”。