我正在开发一种需要3D“基于体素”引擎的工具。我的意思是它将涉及从网格中添加和删除多维数据集。为了管理这些立方体,我需要一个允许快速插入和删除的数据结构。我用k-d树和八叉树看到的问题是,由于这些操作,它们似乎经常需要重新创建(或至少重新平衡)。
在我跳入之前,我希望得到关于最佳方法的意见。
更多细节:
我想最终的问题是,以可以处理频繁插入和删除的方式管理本质上是什么3D点数据的最佳方法是什么?
(不,我不是在做Minecraft)
答案 0 :(得分:1)
Octrees 易于动态更新。通常,树根据每叶上/下人口数量进行细化:
插入新项目时,会将其推送到封闭叶节点的项目列表中。如果超过人口数量上限,则会对叶子进行细化。
当擦除现有项目时,将从封闭叶节点的项目列表中删除它。如果达到较低的人口数,则扫描叶子兄弟姐妹。如果所有兄弟节点都是叶子节点,并且它们的累积项目数量小于上面的人口数量,则删除兄弟节点集合并将项目推送到父节点上。
这两个操作都是局部的,只遍历树的高度,对于分布良好的点集,它是O(log(n))
。
KD-tree 不易动态更新,因为它们的结构基于完整点集的分布。
还有许多支持动态更新的其他空间数据结构 - R-trees,Delaunay triangulations仅举几例,但目前尚不清楚它们是否提供比八叉树更好的性能。我不知道任何支持比O(log(n))
动态查询更好的空间结构。
希望这有帮助。