【问题标题】:Do quadtrees automatically self sort?四叉树会自动自排序吗?
【发布时间】:2018-06-17 17:36:59
【问题描述】:

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

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

四叉树会发生什么? 我需要重建它吗?

我只是不明白,当你刚刚更新节点数据时,四叉树是否会自动进行自我排序,或者我是否需要在更新节点时重建整个树。

【问题讨论】:

  • 您所说的“排序”是什么意思,您想到的排序顺序是什么?通常,标准四叉树中的节点从不移动。如果四叉树中的对象(点/矩形/...)移动,它要么留在同一个节点(如果它仍然适合该节点),要么从节点中移除并重新插入另一个节点。
  • 这就是我要问的,当一个节点,比如说它代表一个角色在关卡中传送或只是移动时,你需要重建树吗?
  • 也许我误解了你所说的“节点”是什么意思。四叉树由节点组成,但这些从不移动,您只能在节点中添加/删除对象或在节点内移动它们。但是,如果您的意思是“节点”是您存储在四叉树中的某种类型的对象,那么当您的“节点”之一移动时,您通常会将其从四叉树中删除并再次添加,但这些“节点”什么都没有与四叉树的节点有关,基本上你会将你的“节点”之一存储在四叉树节点中......

标签: computer-science quadtree


【解决方案1】:

我见过人们为每帧移动的对象实现四叉树的方法有很多种,包括为此目的使用松散四叉树,其中甚至允许节点具有重叠的 AABB,这些 AABB 会随着存储在树叶四处移动。

也就是说,我发现它足够简单,可以相当便宜地更新非松散版本(不过,不像空间散列或网格那样便宜,但足够便宜,可以在大量实体四处移动时保持稳定的帧速率碰撞检测)。

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 2016-09-14
  • 1970-01-01
  • 2011-12-16
  • 2017-08-09
  • 2017-03-14
相关资源
最近更新 更多