我正在开发一个八叉树实现,其中树节点的尺寸长度(作为2的幂)进行模板化:
template<long N>
struct node_t {
enum { DIM = 1 << N };
node_t<N+1> * parent;
node_t<N-1> * children[8];
long count;
}
专门针对N = 0(离开)指向数据。
struct node_t<0> {
enum { DIM = 1 };
node_t<1> * parent;
data_t data;
long count;
}
(旁白:我想我可能还需要一个排除父指针的N_MAX专门化,否则C ++会生成增加N个广告的类型?但这与我的问题无关。 )
我想创建一个沿着我的八叉树所占据的3D空间中的光线步进的函数,所以表面上我可以只保留一个指向根节点(具有已知类型)的指针并从该节点遍历八叉树。每一步都扎根。但是,我更喜欢一个更“本地”的选项,在这个选项中我可以跟踪当前节点,这样我就可以在可能的情况下从树中开始,从而避免不必要地遍历八叉树的上层节点。
但我不知道那个类型指针是什么(或任何其他实现方式),所以我没有经历切片。
我没有绑定到模板,因为维度可以简单地实现为long const
。但后来我不知道如何制作它以使叶子具有与inode不同的子类型。
感谢您的帮助!
我想这样做而不是类似于this的原因是因为每个节点中的count
变量:如果计数为0,我想跳通过整个立方体,而不是浪费时间通过叶子,我知道是空的。 (这适用于光线追踪体素引擎。)
答案 0 :(得分:0)
尽管我喜欢模板,但您的代码实际上可能更简单:
class node {
node* parent; // NULL for root node
long dim;
long count;
virtual rayTrace(Ray) = 0;
};
class leafNode : node {
data_t data;
virtual rayTrace(Ray);
};
class nonLeafNode : node {
vector<node*> children;
virtual rayTrace(Ray);
};
这样做的好处是树可以是你想要的任何深度,包括一些子树可以比其他更深。它有一个缺点,即必须在运行时计算昏暗,但即使这样也有一线希望,如果你的树真的很大,你可以把它变成双倍。