我正在C++中实现一个八叉树,它稍后应该包含一个用于渲染的网格。但目前我正忙于建造八叉树。更确切地说,是addNode()函数造成了问题。我想到了一个类似于二叉树的递归实现:二进制树实现C++
然而,在八叉树中,每个节点都有8个子,而不是只有2个子。此外,因此我不能像在二进制树中那样使用简单的开关(左/右)来决定在哪里添加节点。我需要检查8个子中是否有一个是空的(指针为NULL),如果没有指针为NULL,我需要用其中一个子作为参数调用add函数。然而,这将导致一个八叉树,其中第一个子总是包含以下所有子八叉树。这个加法函数通常是如何实现和避免这个问题的?
您有正确的想法,只需要将概念扩展到三维即可。您还必须选择上方或下方(y维度)以及前方或后方(z维度),而不是确定子对象应插入左侧还是右侧(x维度)。你可以使用这样的三维阵列:
Node* children[2][2][2];
你的内部节点(那些有分支的节点)应该有一个三维的中心和大小。在决定将值插入八叉树的位置时,需要将插入或搜索的位置与当前八叉的中心进行比较:
children[position.x > center.x][position.y > center.y][position.z > center.z]
这会将指针指向要插入的位置。如果在这个位置上有节点,那么如果它是另一个分支,则需要递归,如果它为null,则需要创建一个新节点,或者如果它是叶节点,则创建一个分支并重新插入。
在子对象上迭代时,您可能会发现三维数组很麻烦。相反,您可以使用一维数组并将其索引为,就好像它有三个维度一样:
Node* children[8];
int index = (position.x > center.x) << 2 |
(position.y > center.y) << 1 |
(position.z > center.z);
这通过根据位置相对于八进制中心的位置设置位来生成索引[0-7]。
您需要检查对象的x、y、z维度,并且八叉树可以保存有限数量的对象。