Algorithm 碰撞检测算法的运行时

Algorithm 碰撞检测算法的运行时,algorithm,collision-detection,particles,Algorithm,Collision Detection,Particles,我想出了一个算法来预测两个粒子之间的碰撞。给定一个矩形环境(宽度w,高度h),以及两个具有已知起始位置和速度的粒子,它可以确定 这两个粒子是否会碰撞 如果是,两个粒子下次碰撞的时间 在有限的步骤中,也就是说O(1)。通过扩展,它可以对O(n^2)中的n个粒子执行此操作。这种方法有什么新颖之处吗 我假设粒子以恒定速度线性移动,并占据点(因此当两个粒子占据同一点时会发生碰撞) 感谢您的帮助。对于n个粒子,只需比较所有粒子对,并为每个粒子外推一条线段,以查看它们碰撞的位置,就可以在O(n^2)时间

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

  • 这两个粒子是否会碰撞
  • 如果是,两个粒子下次碰撞的时间
在有限的步骤中,也就是说
O(1)
。通过扩展,它可以对
O(n^2)
中的n个粒子执行此操作。这种方法有什么新颖之处吗

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


感谢您的帮助。

对于n个粒子,只需比较所有粒子对,并为每个粒子外推一条线段,以查看它们碰撞的位置,就可以在O(n^2)时间内完成这项工作


存在更高效的算法,通常是基于使用诸如;对另一种可能的方法有很好的概述。

这里是一个简单的解决方案,假设光栅化设置,并且碰撞(粒子间或粒子壁)不会修改粒子的方向和速度。其主要思想是将粒子的轨迹“绘制”成大小为
wxh
的光栅

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
可以是
w
h
n
(例如
c=sqrt(max(w,h))
)的常数或某些函数


当然,如果
w
和/或
h
非常大,上述所有操作都是无用的。

我认为确实需要O(n(n+1))即O(n^2)来检查所有粒子对。我不认为有更快的算法。这取决于你所说的“新奇”是什么意思。这似乎是一个非常简单的问题,你不可能因此变得富有和出名。但这也不是我以前见过的问题。(这是假设粒子从环境边缘反弹。如果没有,那么这当然是一个小问题。)谢谢你的回答。我设计的算法也可以在O(n)中的n维(预测两个粒子之间的碰撞)中运行(要检查的精确案例数为4(n-1))。它可以证明两个粒子要么在某个时间t碰撞,要么根本不会碰撞。这与现有的方法有什么不同吗?@vincemathic你仍然可以通过简单地获取每对粒子并投影它们的路径来找到它们的向量相交的地方,这是一个O(1)运算。我不知道这是否能在不到O(n^2)的时间内完成,但你能在O(n^2)的时间内完成n^2o(1)个操作并不奇怪!对于落选的选民来说,我的回答中哪一部分你不喜欢/认为“不合理”?