【问题标题】:Intersection of two moving line segments (or a moving line segment and a point)两条移动线段(或一条移动线段和一个点)的交点
【发布时间】:2012-02-01 16:04:44
【问题描述】:

我正在尝试设计一个具有连续碰撞检测功能的 2D 物理引擎。对象存储为非旋转线段列表。因此,我可以通过查找任意两个对象之间的每对线段之间的碰撞时间来检测碰撞。

我想找到两个沿恒定方向移动的移动线段之间相交的准确时间,但事实证明这很困难。

我发现我可以通过查找线段上每个点与另一个线段(反之亦然)之间的碰撞时间来进一步简化问题。它可能在计算上效率低下,因此两条线段的通用解决方案将是理想的答案。我也可以忽略线平行的情况(我想将共享相同位置和速度的线/点视为“无碰撞”)。

如果答案是“不可能”完全找到这个交叉点时间,我会接受它作为解决方案。任何有关该主题的帮助将不胜感激。

编辑:根据维基百科关于Line segment 的文章,对于具有端点A = (a_x, a_y)C = (c_x, c_y) 的线段,线段的一般方程如下所示:

对于线段--点交点,将替换

  • p_x + p_v * t for a_x(仅左侧,右侧仅p_x
  • p_y + p_v * t for a_y(仅左侧,右侧仅p_y
  • q_x + q_v * t for c_x(仅左侧,右侧仅q_x
  • q_y + q_v * t for c_y(仅左侧,右侧仅q_y
  • r_x + r_v * tx
  • r_y + r_v * ty

对于线段 pq [(p_x, p_y), (q_x, q_y)],点 r (r_x, r_y),以 p_v == q_v 的速率移动!= r_v 可解为 t?这是完整的方程式:

【问题讨论】:

    标签: 2d collision-detection


    【解决方案1】:

    我上面的方程是不正确的,因为它的 x 和 y 分量使用相同的速度。

    由于速度是恒定的,我可以简化方程,使点相对于线段移动。通过将v = r_v - qp_v 用于点r 的速度,将0 用于每个线段的速度,用于速度的变量数量大大减少。插入变量的方程变为:

    感谢 WolframAlpha,然后求解方程得到 t:

    有趣的是,如果您对此进行分析,它对于 3D 来说是对称的。 [x1, y1, 0][x2, y2, 0] 的叉积是 [0, 0, x1*y2 - y1*x2]。然后这个等式转化为:

    【讨论】:

      【解决方案2】:

      对于线段--点相交,我可以找到一个发生碰撞的区间(虽然这个区间比实际发生碰撞的时间要大):

      给定一条线段[p, q]v 的速度移动,以及一个点r 的速度为wdirection(w) != direction(v),定义三条线L1 = [p, p+v], L2 = [q, q+v], L3 = [r, r+w]。令t1, t_pt2, t_q 分别为L1L3 之间以及L2L3 之间的交叉时间。如果区间[t1, t2][t_p, t_q]不互斥,则这两个区间的交集存在交集(例如[-1, 10][2, 20]的交集为[2, 10])。如果这些间隔是互斥的,则没有冲突。

      此外,如果vw 的方向相同,但长度不同,则可以找到确切的碰撞时间。当投影到线 [p, q] 上时,让 s 成为点 r。如果该点在线段[p, q]中,则在时间t1发生碰撞,可以通过点r和点s之间的距离除以点r之间的相对速度来计算和线段[p, q]

      使用间隔,可以通过使用类似于二分搜索的方法来比较特定时间段和点之间的距离,从而获得时间的估计值。然而,这是非常低效的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 1970-01-01
        • 2021-07-05
        • 2023-03-07
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多