判断在圆周上运动的两点是靠近还是分离的算法

3
我正在寻找一个算法,用于确定两个点(p1,p2)在已知速度下绕圆移动时,从它们之间较小的弧的角度来看,它们之间的距离是增加还是减少。

enter image description here

  • 我知道p1和p2在度数/弧度上的位置。
  • 我知道两个物体的速度(piV,p2V)是在一个均匀的比例尺上的。
  • 我知道p1和p2之间短弧的绝对值,以度数/弧度表示(始终为正值)。但是,如果有帮助的话,我也可以知道短弧作为负值或正值,从p1的角度来看,当p2在后面(右侧)时为负,如果p2在前面(左侧),则为正。
  • 当它们逆时针移动时,速度为正,当它们“逆行”(顺时针移动)时,速度为负。

1
例如,如果从p2到p1的弧小于180且speedP2> speedP1,则它们正在接近。现在为其他组合编写逻辑。http://idownvotedbecau.se/noattempt/ - Andreas
我刚刚修改了Rory的问题。短弧总是被称为正值或绝对值。 - Cliff Ribaudo
@andreas,我已经尝试用C语言解决了很多次,但那些算法过于复杂,有太多的边角情况无法在这里展示,而且也不是很相关。我希望有人能指点我一种更加优雅的解决方案,需要具备更好的三角函数/几何学知识。 - Cliff Ribaudo
3
如果你正在寻找“三角函数/几何学方面的能力”,你应该在https://math.stackexchange.com/上提问。 - Andreas
1
你知道P1是在P2前面还是后面,而且你知道哪一个正在移动得更快。因此有四种情况需要考虑,或者你可以使用异或来完成。问题在哪里? - Beta
3个回答

2
这个问题的真正挑战在于处理180度处的极坐标奇点,因此我将跳过这一点,改用向量数学,虽然效率略低但更容易理解。希望其他更擅长模运算的人能解决这个问题。
将角位置转换为笛卡尔坐标: (X, Y) = R * (cos θ, sin θ) 假设物体具有笛卡尔坐标P1,P2。引入2D叉积: A ^ B = Ax By - Ay Bx 如果A相对于B顺时针旋转,则结果为正,反之亦然。
假设物体具有角速度W1,W2,其中正号表示按照极坐标惯例逆时针旋转。
当物体2相对于物体1顺时针旋转(如图所示:P1 ^ P2 < 0)时:
  • 如果W1,W2 > 0W2 > W1
  • 或者,如果W1,W2 < 0-W1 > -W2
  • 或者,如果W1 < 0W2 > 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(P1 ^ P2) = sign(180 - [θ2 - θ1] % 360),但我不知道该怎么使用它。 - Cliff Ribaudo
1
@CliffRibaudo 这只是说明这两个表达式是等价的(至少我认为是这样),你可以使用第二个表达式,因为它更有效率。要检查的实际条件是 sign(W1 - W2) == sign(P1 ^ P2) != 0 - 替换第二项即可。 - meowgoesthedog
其实...还是有点困惑。1)^,XOR是什么意思?(我在用C语言编程)2)你写的SIGN是真的指SIGN还是应该是SIN?3)假设你确实是指SIGN而不是SIN,那么SIGN(p1 ^ p2)是什么意思?p1和p2始终是0到360之间的两个正数,所以不清楚它如何解决问题。 - Cliff Ribaudo
1
@CliffRibaudo 1)^ 是上面定义的二维叉积,而不是异或。2)是的,signsin 是不同的函数。3)sign(P1 ^ P2) 是笛卡尔坐标(而非极角)的叉积的符号。我已经在我的答案中定义了从角度到笛卡尔坐标的转换。 - meowgoesthedog

0
感谢@beta的评论,它引导我朝着正确的方向前进。我错过了p1相对于p2的方向(正或负),这已经是已知的事实。因此,没有必要将值转换为其他坐标系。
答案非常简单:
SIGN((p2V - p1V) * Angle) = (+ if separating, - when closing or approaching)

我将其简化为以下的C代码:
return ((p2V - p1V) * angle) > 0 ? 1 : -1;

如果使用的是有符号的夹角,当p2相对于p1逆时针(左侧)时为正,而当p2相对于p1顺时针(右侧)时为负,则此方法效果良好。


-1

将参考系移动到p1。现在你有一个静态点p1和以速度p2V - p1V从位置p2-p1开始移动的p2。现在的问题是:什么时候p2会撞到原点?

不幸的是,这里有三种情况,取决于p2V - p1V的符号:

  1. 速度为零,点永远不会相撞。
  2. 速度为正,意味着p2将绕圆圈走并击中360度。
  3. 速度为负,意味着p2将直接走向原点并击中0度。

唯一需要注意的是正确计算p2 - p1的初始位置。我建议假设初始位置在0到359之间,然后相应地调整p2 - p1(如果为负,则加上360)。基本上,计算所有内容“模360”。


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