Computer science 四叉树是否自动进行自我排序?

Computer science 四叉树是否自动进行自我排序?,computer-science,quadtree,Computer Science,Quadtree,假设我有一个四叉树。 假设我有一个移动的物体在里面 我知道当你添加和删除节点时,四叉树会自动排序,但是当一个节点,比如说在他的更新函数中,移动到另一个无关节点的左边时,会发生什么呢? 或者基本上是这个节点传送 四叉树怎么了? 我需要重建它吗 在我看来,我无法理解在更新节点数据时,四叉树是否会自动进行自排序,或者在更新节点时是否需要重建整个树。我见过很多人为每帧移动的对象实现四叉树的方法,包括使用松散的四叉树,其中节点甚至允许有重叠的AABB,这些AABB随着存储在叶子中的对象的移动而扩展和收缩

假设我有一个四叉树。 假设我有一个移动的物体在里面

我知道当你添加和删除节点时,四叉树会自动排序,但是当一个节点,比如说在他的更新函数中,移动到另一个无关节点的左边时,会发生什么呢? 或者基本上是这个节点传送

四叉树怎么了? 我需要重建它吗


在我看来,我无法理解在更新节点数据时,四叉树是否会自动进行自排序,或者在更新节点时是否需要重建整个树。

我见过很多人为每帧移动的对象实现四叉树的方法,包括使用松散的四叉树,其中节点甚至允许有重叠的AABB,这些AABB随着存储在叶子中的对象的移动而扩展和收缩

这就是说,我发现它足够简单,可以以合理的价格更新非松散版本(但不如空间散列或网格便宜,但便宜到可以在大量实体通过碰撞检测四处移动的情况下保持稳定的帧速率)

简单的方法是在移动元素之前将其从树中移除,移动它,然后将其重新插入到树中。删除元素时,请检查它所属的节点。如果它们变为空(没有存储元素,没有子元素),则将它们从父元素中删除。如果父节点变为空(没有子节点存储在该节点中,如果在分支中存储元素,则该节点中没有元素),则从父节点中删除父节点,然后重复

提高速度的诀窍是避免过多的内存分配。如果为节点使用空闲列表,则会有所帮助,例如,另一种可能加快速度的方法是检测对象何时不会从一个节点移动到另一个节点


例如,可以按时间步长乘以其速度展开实体的边界框或球体,并测试该展开的边界框/球体是否与新节点重叠。如果没有,则不需要从树中删除元素,移动它,然后重新插入。你可以继续,简单地移动它。或者您可以只存储它以前的位置,移动它,然后查看它是否属于不同的节点。如果是这样,请将图元移除,就像它具有以前的位置一样,然后使用新位置重新插入。我还没有发现这一点是必要的,因为我可以通过索引操作而不需要堆分配/释放来完成大部分工作。

你所说的“排序”是什么意思,你想的排序顺序是什么?通常,标准四叉树中的节点从不移动。如果四叉树中的一个对象(点/矩形/…)移动,它要么留在同一个节点中(如果它仍然适合该节点),要么从节点中删除并重新插入另一个节点。这就是我要问的,当一个节点,假设它代表一个角色在关卡中进行远程传送或者仅仅移动?也许我误解了你所说的“节点”的意思。四叉树由节点组成,但这些节点从不移动,只能在节点中添加/删除对象或在节点内部移动对象。但是,如果“节点”是指存储在四叉树中的某种类型的对象,则当其中一个“节点”移动时,通常会将其从四叉树中删除并再次添加,但这些“节点”与四叉树的节点无关,基本上,您将把一个“节点”存储在一个四叉树节点中……对此主题做了全面的总结: