我想出了一种用于预测两个粒子之间碰撞的算法。给定一个矩形环境(宽度 w
,高度 h
),以及两个具有已知起始位置和速度的粒子,它可以确定
在有限的步骤中,所以说O(1)
。通过扩展,它可以为O(n^2)
中的 n 粒子执行此操作。这种方法有什么新颖的东西吗?
我假设粒子以线性方式和恒定速度移动,占据点(因此当两个粒子占据同一点时会发生碰撞)。
感谢您的帮助。
答案 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
可以是w
,h
和n
的常量或函数(例如c=sqrt(max(w,h))
)。
当然,如果w
和/或h
不方便,上述所有内容都无用。