如何迭代Quad / Oct树

时间:2012-07-15 00:17:14

标签: c++ containers quadtree octree

我很难掌握如何迭代八叉树或四边形。这可能是因为我没有经历过不同的迭代神话。但是我们假设我生成了一个四叉树,它包含浮点x,y,z;双色。现在,让我们也说这个节点一次只能生产4个孩子(这些孩子可以生产4个孩子等等),直到达到7个等级(这样孩子就不能再生孩子了,但是兄弟/姐妹们可以),所有创建的4个孩子都是相同的双色(再次,如果发生这种情况,它的兄弟/姐妹仍然可以产生),或者创建的总节点数等于87380.当上述情况发生时,它被置于一个容器。这个过程还在继续。

现在这个容纳节点的容器(例如)有7层深,所有孩子的孩子都有不同的x,y,zs和颜色。我遇到的问题是我如何迭代这个容器,我怎么能经历所有的孩子,姐妹?由于根导致4个孩子,这4个孩子有4个孩子等,等等:4 ^ 1 + 4 ^ 2 .... + 4 ^ 7。如何在不编写复杂的if语句的情况下找到我想要的节点,并迭代整个节点(从root开始)?容器(生成节点的容器)是否需要额外的代码才能使这个过程变得简单?

很抱歉,如果问题一般。

1 个答案:

答案 0 :(得分:4)

迭代整个树很容易,你可以递归地进行。

void iterate(node *n) {
    // do something with n
    if (n->child1 != NULL) iterate(n->child1);
    if (n->child2 != NULL) iterate(n->child2);
    if (n->child3 != NULL) iterate(n->child3);
    if (n->child4 != NULL) iterate(n->child4);
}

然后拨打iterate(root)do something将在四叉树中的每个节点上发生。

我怀疑这不是你所要求的。如果您正在做的就是将数据保存在四叉树中没有意义。如果您想在四叉树中找到特定节点,那么您还需要其他东西。假设你想在四叉树中找到一个点x,y。然后你做了类似的事情:

void find(node *n, float x, float y) {
    if (x == n->x && y == n->y) // you've found it!
    if (x < n->x) {
        if (y < n->y) {
            if (n->child1 != NULL) {
                find(n->child1, x, y);
            } else {
                // point not in quadtree
            }
        } else {
           ...same, but child2
        }
    } else {
        ...same, child3 & 4
    }
}

请注意,四叉树通常不会在它们自己存储的点上分割,它们通常通过将分割坐标与点(仅存储在四叉树的叶子中)分开存储来分割。有关示例,请参阅wikipedia picture

相关问题