碰撞检测算法的运行时

时间:2016-02-21 09:34:44

标签: algorithm collision-detection particles

我想出了一种用于预测两个粒子之间碰撞的算法。给定一个矩形环境(宽度 w ,高度 h ),以及两个具有已知起始位置和速度的粒子,它可以确定

  • 两个粒子是否永远碰撞
  • 如果是,则两个粒子下次碰撞的时间

在有限的步骤中,所以说O(1)。通过扩展,它可以为O(n^2)中的 n 粒子执行此操作。这种方法有什么新颖的东西吗?

我假设粒子以线性方式和恒定速度移动,占据点(因此当两个粒子占据同一点时会发生碰撞)。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

通过比较所有粒子对,并且为每个粒子外推一个线段以查看它们碰撞的位置,在n(n ^ 2)时间内对n个粒子很容易做到这一点。

存在更高效的算法,通常基于使用诸如quadtree之类的东西在内存中索引对象的想法; Wikipedia article on collision detection对另一种可能的方法有很好的概述。

答案 1 :(得分:0)

这是一个直接的解决方案,假设光栅化设置,并且碰撞(粒子间或粒子墙)不会改变粒子的方向和速度。主要思想是将粒子的轨迹“绘制”成大小为w x h的栅格。

allocate a raster of size w*h, each pixel being able to keep a list of (time,particle_id) tuples
for each particle pa
    for each pixel pi on the direction of pa
        store the tuple (time_of_pa_at_pi, pa_id) in the list of pi
for each pixel pi in the raster
    check for collisions inside the list of pi by ordering the tuples by time

最糟糕的情况很难描述,但性能的上限是O(n*max(w,h)) + O(wh) + max(w,h)*O(n*logn)。最糟糕的情况可能发生在所有粒子(或其中很大一部分)沿同一方向行进时。假设所有输入参数均匀随机分布,这是极不可能的。假设在平均情况下,性能应该好很多。

此外(但这可能是此答案的重要部分),如果您首先分配较小的栅格(例如,大小为w/c x h/c)并且您在此处运行可能的碰撞检查,则可以获得加速。与上述相同。此栅格中的像素较大,因此可能的碰撞步骤较少。在此步骤结束时,您将感受到每个宏观像素中可能发生的情况,然后在本地继续进行调查(以递归方式或使用其他技术)。上面的c可以是whn的常量或函数(例如c=sqrt(max(w,h)))。

当然,如果w和/或h不方便,上述所有内容都无用。