如何在C ++中构造一个八叉树

时间:2014-03-03 20:41:37

标签: c++ tree construction octree

我正在用C ++实现一个Octree,它后面应该包含一个用于渲染的网格。但目前我正在努力建设八月树。更确切地说,addNode()函数会导致问题。我想到了一个类似于二叉树的递归实现: Binary Tree implementation C++

但是,在八叉树中,每个节点都有8个子,而不仅仅是2.因此,我不能像在二叉树中那样使用简单的开关(左/右)来决定添加节点的位置。我需要检查8个儿子中的一个是否为空(指针为NULL),如果没有指针为null,我需要调用add函数,其中一个儿子作为参数。但是,这将导致八叉树,其中第一个子将始终包含所有后续子八叉树。如何通常实现此添加功能并避免此问题?

2 个答案:

答案 0 :(得分:0)

您需要检查对象的x,y,z维度,并且八叉树可以保存有限数量的对象。

答案 1 :(得分:0)

您已经有了正确的想法,您只需要将概念扩展到三个维度。不必确定是否应将儿童插入左侧或右侧(x维),您还必须选择上方或下方(y维),以及前方或后方(z维)。您可以使用这样的三维数组:

Node* children[2][2][2];

你的内部节点(带有分支的节点)应该具有3-D中心和大小。在确定应将值插入八叉树的位置时,需要将插入或搜索的位置与当前八分圆的中心进行比较:

children[position.x > center.x][position.y > center.y][position.z > center.z]

这会给你指针插入的位置。如果在这个位置有节点,如果它是另一个分支你需要递归,如果它是空的则创建一个新节点,或者创建一个分支并重新插入它是否为叶子节点

在迭代孩子时,您可能会发现三维数组很麻烦。相反,你可以使用一维数组和索引,就好像它有三个维度:

Node* children[8];

int index = (position.x > center.x) << 2 |
            (position.y > center.y) << 1 |
            (position.z > center.z);

通过根据位置相对于八分圆中心的位置设置位来生成索引[0-7]。