我目前正在使用四叉树实现碰撞检测系统。我能够实现四叉树,但我对特定情况有疑问。 让我们说我的初始四叉树的边界为200x200。因此,我的第一级子四叉树将具有以下边界:
NW:(0,0)〜(100,100)
SW:(0,100)〜(100,200)
NE:(100,0)〜(200,100)
SE:(100,100)〜(200,200)
假设在(98,98)处有一个方形物体,其宽度和高度为5.我将它们插入子树时采取中心位置,因此该物体将被放置在NW四叉树中。但是,由于其宽度和高度均为5,因此技术上它们也适用于所有其他3个四叉树。我是否必须检查对象的边界是否跨越到四叉树的另一侧,如果是,则将多个实例添加到四叉树中?
答案 0 :(得分:2)
是 - 或者在插入时,在这种情况下将你的方块分成4个单独的方块。更容易的是只允许重复项存储在树叶上,并使它便宜(指针/索引到正方形,例如)
您也可以制作一个宽松的树,只需选择其中一个孩子插入这个方块,然后展开其边界框以适应。在这些情况下,您有重叠的分区,并且必须以递归方式下降树进行搜索,因此它有其优点和缺点。
您可以做的另一件事是允许元素存储在分支中而不仅仅是叶子中。在这种情况下,如果一个元素想要进入多个子元素,只需将其存储在分支中而不是进一步下降。为此,您必须在遍历期间检查每个分支处的元素,而不仅仅是在叶子处。
我建议刚开始使用重复项。其他方法可能是一个真正的麻烦,不需要打扰这样的麻烦(直到你测量它的需要)。
这些在任何分支的死点都有一个区域的元素可能会让你的树真正深度和不平衡,所以你通常需要一个健康的停止间隙来防止它永远递归。它通常不是一个大问题,除非你有很多这样的元素。
此外,对于2D情况,您有时可以使用固定网格。实际上,有时候只有一个NxM网格而不是四叉树可以更好地工作,因为它构建起来非常简单(这使得更快速地更新非常动态的内容,例如,精灵在周围移动屏幕每一帧),并没有棘手的最坏情况,因为它没有“#34; depth"”的概念,只是包含元素的单元格。