帧速慢的碰撞检测

时间:2019-12-01 07:32:37

标签: python algorithm loops collision-detection

我对碰撞检测算法一无所知,但出于教育目的,我正在尝试在Python粒子系统中处理碰撞。

我现在检测碰撞的方式似乎效率很低。可能是最慢的算法:

  • 遍历我的粒子列表中的所有粒子(由半径定义的圆)(通过for循环),将当前粒子称为p
  • 在每次迭代中,将p与每个其他粒子(另一​​个用于循环)进行比较
  • 检测碰撞

使用上述方法,当粒子数较高而FPS较低时,我的某些粒子甚至无法检测到碰撞。在我当前的方法中是否有办法防止这种情况发生,或者我将不得不实现另一个更有效的方法(这可能是可行的方法)?

1 个答案:

答案 0 :(得分:1)

提高效率的常用技术是将所有对象放入某种空间分区数据结构中,以将对的数量限制为接近O(n)而不是O(n ^ 2)的大小,这就是您所需要的现在。四叉树和k-d树是两个候选对象。这些树中的节点代表空间区域。仅需要检查包含在同一区域中或相交于同一区域的成对对象。

为避免遗漏碰撞,比较点是不够的。而是检查每个粒子从先前位置到当前位置的线段的交点。因此,您需要一个“边缘” quadtreekd-tree

要考虑的另一件事是是构建一个空间分区并在帧之间更新它,还是为每个帧从头开始重建分区。前者要复杂得多,可能无法提高速度。先尝试后者。