自动平衡(或廉价平衡)3D数据结构

时间:2013-08-01 09:21:39

标签: data-structures 3d voxel

我正在开发一种需要3D“基于体素”引擎的工具。我的意思是它将涉及从网格中添加和删除多维数据集。为了管理这些立方体,我需要一个允许快速插入和删除的数据结构。我用k-d树和八叉树看到的问题是,由于这些操作,它们似乎经常需要重新创建(或至少重新平衡)。

在我跳入之前,我希望得到关于最佳方法的意见。

更多细节:

  • x,y,z位置在整数空间
  • 需要足够高效才能实现实时应用
  • 对使用的立方体数量没有硬性限制。 很可能这个数字通常是无关紧要的 低(<100),但我希望工具处理尽可能多 尽可能多维数据集

我想最终的问题是,以可以处理频繁插入和删除的方式管理本质上是什么3D点数据的最佳方法是什么?

(不,我不是在做Minecraft)

1 个答案:

答案 0 :(得分:1)

Octrees 易于动态更新。通常,树根据每叶上/下人口数量进行细化:

  1. 插入新项目时,会将其推送到封闭叶节点的项目列表中。如果超过人口数量上限,则会对叶子进行细化。

  2. 当擦除现有项目时,将从封闭叶节点的项目列表中删除它。如果达到较低的人口数,则扫描叶子兄弟姐妹。如果所有兄弟节点都是叶子节点,并且它们的累积项目数量小于上面的人口数量,则删除兄弟节点集合并将项目推送到父节点上。

  3. 这两个操作都是局部的,只遍历树的高度,对于分布良好的点集,它是O(log(n))

    另一方面,

    KD-tree 不易动态更新,因为它们的结构基于完整点集的分布。

    还有许多支持动态更新的其他空间数据结构 - R-treesDelaunay triangulations仅举几例,但目前尚不清楚它们是否提供比八叉树更好的性能。我不知道任何支持比O(log(n))动态查询更好的空间结构。

    希望这有帮助。