我正在尝试使用四叉树进行2D碰撞检测,但是我对如何实现它有些困惑。首先,我要有一个四叉树,其中包含四个子树(一个代表每个象限),以及一组不适合单个子树的对象的集合。
当检查对象在树中是否存在冲突时,我会做类似这样的事情(感谢QuadTree for 2D collision detection):
要查找四叉树中的所有碰撞,请执行以下操作:
插入四叉树:
要更新四叉树:
这样好吗可以改善吗?
最佳答案
您的四叉树结构不是最佳的。您每个节点存储4个子树是正确的,但是实际对象仅应存储在叶子内部,而不是内部节点。因此,保存实际对象的集合需要移动到叶子上。
让我们看一下这些操作的实现:
检查对象是否与当前节点相交。如果是这样,请递归。如果您已经达到叶子级别,则将对象插入集合中。
执行与插入对象完全相同的步骤,但是当到达叶级别时,将其从集合中删除。
执行与插入对象完全相同的步骤,但是当到达叶级别时,检查与集合中所有对象的碰撞。
对于四叉树中的每个对象,执行单个对象碰撞测试。
从已更改位置的四叉树中删除所有对象,然后再次插入它们。
这有几个优点:
唯一的缺点:
关于data-structures - 用于2D碰撞检测的四叉树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4981866/