如何遍历场景图形树结构?

时间:2012-10-26 18:49:46

标签: c++ directx traversal tree-traversal scenegraph

我有一个场景图:

class Node
{
public:

struct
{
    COLLISION_TYPE collisionType;

    void* boundingVolume;
}collisionData;

struct
{
    XMFLOAT3 position;
    XMFLOAT3 rotation;
}leafData;

Node(Model* representModel, Node* parentNode)
{
    this->parentNode = parentNode;
    this->representModel = representModel;

    this->collisionData.collisionType = representModel->collisionDataDefault.collisionType;
    this->collisionData.boundingVolume = &representModel->collisionDataDefault.boundingVolumeDefault;
};

~Node()
{

};

std::vector< std::vector<XMFLOAT3*> > GetChildTransformStream()
{

};

void Transform(XMMATRIX *world)
{

};

Model* representModel;

Node* parentNode;
std::vector<Node*> childNodes;
};

所以在方法转换中我想要转换节点的坐标及其所有子节点的坐标,所以我必须首先得到所有具有GetChildTransformStream的子节点的列表,但我不知道如何遍历它,因为它可以有任意数量的子节点,并且它们可以有任意数量的子节点等等。你通常如何处理这个?

2 个答案:

答案 0 :(得分:1)

进行树遍历的一种简单方法是使用堆栈。推送堆栈中的所有子节点,弹出每个子节点,将其推送到堆栈中,处理它等等。

编辑:请注意,Chac的回答只是一个特例。在那里,用于存储遍历状态的堆栈实际上是函数调用堆栈。

编辑:使用堆栈概述典型树遍历的源代码。

#include <vector>
#include <stack>
#include <iostream>

struct Node {
    std::vector<Node*> children;
    void Visit() const { std::cout << "Visited a node!\n"; }
};

void TraverseTree(Node* root) {
    std::stack<Node*> stack;
    stack.push(root);

    while (!stack.empty()) {
        Node* currentNode = stack.top();
        stack.pop();

        // push all children onto the stack:
        for (std::vector<Node*>::const_iterator i = currentNode->children.begin();
            i != currentNode->children.end();
            i++)
        {
            stack.push(*i);
        }

        // do any processing for this node here
        currentNode->Visit();
    }
}

int main(int argc, char** argv)
{
    Node a,b,c,d,e,f;
    a.children.push_back(&b);
    a.children.push_back(&c);
    b.children.push_back(&d);
    d.children.push_back(&e);
    d.children.push_back(&f);
    TraverseTree(&a);
}

答案 1 :(得分:1)

一种简单的方法是递归函数:

void visit(Node *node) {
  // apply whatever needed to node
  for (int c = 0; c < node->childNodes.size(); ++c)
     visit(node->childNodes[c]);
}
相关问题