到目前为止,关于设计决策的一些背景知识......我开发了一个可以存储点的八叉树结构。我选择根据某个基本体素大小来限制“世代”的递归。仅当将点添加到该节点时才会创建子节点。这不是一个动态的图形应用程序——这个八叉树和其中的对象是静态的,因此无需担心提高性能的预处理。
现在,我想在我的八叉树中添加“形状”——特别是由三角形组成的表面网格。这些三角形的顶点与八叉树中存储的点不对应。如何将这些形状存储在八叉树中?我看到两个选项...
灰色节点是“空的”,因为它们没有形状。在备选方案 1 中,形状存储在它们相交的每个节点中 - 即,节点 1a 包含 shape1,而 4c 和 4d 共享 shape2。在备选方案 2 中,形状仅存储在它们相交的最小节点中 - 即,节点 1a 包含 shape1,节点 4 包含 shape2。
我见过的大多数关于八叉树的帖子都假设 Alt1,但他们从未解释过原因。Alt2 对我来说更有意义,只会为那些位于节点边界上的形状创建额外的工作。为什么 Alt1 更可取?
编辑:为了澄清,我使用的实现语言是 C++,所以我更喜欢该语言的示例实现,但问题与语言无关。对不起,如果这是不正确的标签使用。
Edit2:虽然与形状存储问题没有直接关系,但此链接对问题背后的八叉树遍历进行了很好的讨论。我认为它可能会帮助任何有兴趣研究这个问题的人。
更新:四年后,Alt2 最终变得更容易实现,但速度很慢,因为存储在更高八叉树级别的大三角形在每次遍历八叉树时都要进行测试——在我的例子中,这意味着成百上千次不必要的测试。我最终修改了我的代码以使用R*-Tree 变体,这很容易实现并且速度大大加快。