指向模板树节点的通用(非切片)指针? (C ++)

时间:2013-01-25 17:50:31

标签: c++ templates octree

我正在开发一个八叉树实现,其中树节点的尺寸长度(作为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,我想跳通过整个立方体,而不是浪费时间通过叶子,我知道是空的。 (这适用于光线追踪体素引擎。)

1 个答案:

答案 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);
};

这样做的好处是树可以是你想要的任何深度,包括一些子树可以比其他更深。它有一个缺点,即必须在运行时计算昏暗,但即使这样也有一线希望,如果你的树真的很大,你可以把它变成双倍。