在游戏中检测物体之间的碰撞经常用到数据结构四叉树,基本构造思路是:树中每个结点对应一个矩形,每个结点对应的矩形被其四个儿子结点拆成四部分,一般为了方便划分,选用等分成四个面积相等的矩形。
插入的时间复杂度:O(log4(宽*高))
检索的时间复杂度:当所有物体叠加在一起时达到最坏O(物体数量),由于游戏中需要检测碰撞的物体一般是会运动的,所以平均来看是O(log4(宽*高))
删除的时间复杂度:如果对每个树结点都进行了哈希处理,那么可以做到O(1),一般不这样做的话,就跟检索的时间复杂度是一样的
空间复杂度略高,所以会限制树高,通过对每个结点设置一个存储矩形的桶来实现。
一般实现:
插入:找到刚好不能存储这个矩形的结点,把这个矩形丢到这个结点的桶中。因为检索需要遍历桶,为了节约检索时间,一般会将桶的容量设置成一个上限,当超过这个上限时,会从这个结点开始生成四个结点,把桶里合适的矩形丢到子树中。
检索:将这个矩形可能相交的其它矩形对应的树上结点的桶里的矩形都遍历一次,把与其相交的都统计出来即可。
删除:直接找到对应的桶,删除里面的数据即可。
代码实现可参考以下链接:
http://blog.csdn.net/zhanxinhang/article/details/6706217
http://blog.csdn.net/zhouxuguang236/article/details/12312099
https://github.com/timohausmann/quadtree-js/