我有一个场景图:
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的子节点的列表,但我不知道如何遍历它,因为它可以有任意数量的子节点,并且它们可以有任意数量的子节点等等。你通常如何处理这个?
答案 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]);
}