【问题标题】:Algorithm to determine if two points moving around circle are approaching or separating确定绕圆运动的两点是接近还是分离的算法
【发布时间】:2018-11-26 05:54:25
【问题描述】:

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

  • 我知道 p1 和 p2 的位置(以度/弧度为单位)。
  • 我知道两个物体的速度 (piV, p2V) 在一个统一的尺度上。
  • 我知道 p1 和 p2 之间的短弧的绝对值,单位为度/弧度(始终为正值)。但是,如果它有帮助,我也可以知道短弧是负值还是正值,从 p1 的角度来看,当 p2 在后面(右)时它是负值,如果 p2 在前面(左),它是正值。李>
  • 逆时针移动时速度为正,“逆行”(顺时针移动)时速度为负。

非常感谢任何帮助或指导。

赞!!:

感谢@beta 的评论,这促使我朝着正确的方向前进。我错过了我可以使用 p1 从 p2 的方向已知的事实(无需转换为其他坐标系)。答案很简单:

SIGN((p2V - p1V) * Angle) = (+ if separating, - when closing)

我将其简化为以下 C:

return ((p2V - p1V) * angle) > 0 ? 1 : -1;

如果使用带符号的分离角,如果 p2 从 p1 逆时针(左)为 ,当 p2 从 p1 顺时针(右)时 ,则此方法有效.

感谢大家的考虑和时间!

【问题讨论】:

  • idownvotedbecau.se/noattempt,例如类似于如果从 p2 到 p1 的弧为 speedP1 那么它们正在关闭。现在为其他组合编写逻辑。
  • 我刚刚修改了 Rory 的问题。短弧始终称为正值或绝对值。
  • @andreas,我已经多次尝试用 C 来解决它,但是这些算法太复杂了,而且有太多的极端情况,无法在此处发布,而且并不真正相关。我希望有一个更优雅的解决方案,具有更好的三角/几何敏锐度的人可以指出我的方向。
  • 如果您正在寻找“trig/geometry acumen”,您应该在 math.stackexchange.com 上询问
  • 您知道 P1 领先还是落后于 P2,并且您知道哪个移动得更快。所以有四种情况需要考虑,或者你可以用 XOR 来做。有什么问题?

标签: algorithm math geometry trigonometry


【解决方案1】:

这个问题真正的挑战在于处理 180 度的极坐标奇点,所以我将跳过这个并改用向量数学,它的效率略低但更容易理解。希望其他更擅长模运算的人可以解决这个问题。

将角度位置转换为笛卡尔坐标:

(X, Y) = R * (cos θ, sin θ)

假设对象具有笛卡尔坐标P1, P2。介绍二维叉积:

A ^ B = Ax By - Ay Bx

如果 A 相对于 Be 顺时针旋转,则为正数,反之亦然。

假设物体的角速度为W1, W2,其中正号表示逆时针行进,这在极坐标中是常规的。

当对象 2 顺时针旋转 w.r.t.对象 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)

【讨论】:

  • 是的,0/360 度的边界是让你很难弄清楚的原因之一。
  • @CliffRibaudo 是的,尽管将其减少到这个正弦项确实使它更容易一些;我会有另一个想法
  • @CliffRibaudo 我想出了一个可能的解决方案 - 让我知道它是否有效
  • @CliffRibaudo 这只是说明这两个表达式是等价的(至少我认为),您可以使用第二个表达式,因为它更有效。实际要检查的条件是sign(W1 - W2) == sign(P1 ^ P2) != 0 - 替换第二项。
  • @CliffRibaudo 1) ^ 是上面定义的二维叉积,而不是 XOR。 2) 是的 signsin 是不同的功能。 3)sign(P1 ^ P2)笛卡尔 坐标(不是极角)的叉积的符号 - 我已经在我的回答中定义了从角度到笛卡尔的转换。
【解决方案2】:

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

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

  1. 速度为零,点永远不会碰撞。
  2. 速度为正,表示p2 会绕圈转360度。
  3. 速度为负,表示p2会直奔原点,打到0度。

唯一的另一个问题是正确计算p2 - p1 的初始位置。我建议假设初始位置在 0 到 359 之间,然后相应地调整p2 - p1(如果是负数,则添加 360)。基本上,计算一切“模 360”。

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多