VolCarve.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:4k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. //
  3. // VolCarve.h
  4. //
  5. // Matt Ginzton, Kari Pulli
  6. // Mon Jul 13 11:53:22 PDT 1998
  7. // Perform a volumetric space carving on RigidScans.
  8. // Use octrees.
  9. // For occlusion testing, treat octree nodes as spheres.
  10. //############################################################
  11. #ifndef _VOLCARVE_H_
  12. #define _VOLCARVE_H_
  13. #include <stack.h>
  14. #include "RigidScan.h"
  15. #include <math.h>
  16. class CubeTreeBase {
  17.  protected:
  18.   OccSt           type;
  19.   int             parIdx;  // which child we are of parent
  20.   Pnt3            mCtr;    // center of node
  21.   float           mSize;   // length of side (diameter, not radius)
  22.   class CubeTree* parent;  // parent node
  23.   friend class CubeTree;
  24.   friend class CubeTreeLeaf;
  25.   enum { defaultLeafDepth = 3 };
  26.   static int   leafDepth;  // how many levels in a leaf block
  27.   static float leafSize;   // size of the leaves in the tree
  28.   static int   nVoxels;    // how many voxels in a leaf block
  29.   // get list for boundary triangles
  30.   virtual void extract_faces (vector<int> &quad_inds) = 0;
  31.   virtual void keep_walls (bool x, bool y, bool z) = 0;
  32.  public:
  33.   CubeTreeBase(Pnt3 c, float s, CubeTree* parent, int iParIdx);
  34.   virtual ~CubeTreeBase();
  35.   int inside() const   { return type == INSIDE; }
  36.   int outside() const  { return type == OUTSIDE; }
  37.   int boundary() const { return type == BOUNDARY || 
  38.         type == SILHOUETTE; }
  39.   int go_on() const    { return type == BOUNDARY || 
  40.         type == SILHOUETTE ||
  41.                                 type == INDETERMINATE; }
  42.   // spatial info
  43.   inline const Pnt3& ctr (void) const
  44.     { return mCtr; }
  45.   inline const float& size (void) const
  46.     { return mSize; }
  47.   // set the internal depth of leaf clusters
  48.   void set_leaf_depth (int ld);
  49.  protected:
  50.   // find the cube (at the same level)
  51.   // in the direction of face, give its status
  52.   CubeTreeBase*         find_neighbor(int face);
  53.   bool                  is_neighbor_cell (int face, int& iChild);
  54.   virtual CubeTreeBase* recursive_find(int face, stack<int>& path, 
  55.        bool bReachedTop) = 0;
  56. };
  57. class CubeTree: public CubeTreeBase {
  58.   // data for pointer-referenced octree node
  59.  private:
  60.   CubeTreeBase * child[8];  // child nodes
  61.   friend class CubeTreeBase;
  62.   // helpers for pointer-referenced octree node
  63.  private:
  64.   void delete_children(void);
  65.   // helper for find_neighbor
  66.   CubeTreeBase* recursive_find(int face, stack<int>& path, 
  67.        bool bReachedTop);
  68.   void release_space(int i);
  69. protected:
  70.   // get list for boundary triangles
  71.   virtual void extract_faces(vector<int> &tri_inds);
  72.   virtual void keep_walls (bool x, bool y, bool z);
  73.   void  carve_help(vector<RigidScan*> &views, int levels,
  74.    vector<int> &tri_inds,
  75.    float perc_min, float perc_max);
  76. public:
  77.   CubeTree(Pnt3 c, float s, CubeTree* parent = NULL, 
  78.    int iParIdx = -1);
  79.   ~CubeTree(void);
  80.   void  carve(vector<RigidScan*> &views, int levels,
  81.       vector<Pnt3> &coords, vector<int> &tri_inds);
  82. };
  83. struct CubeTreeLeafData {
  84.   float distance;
  85.   float confidence;
  86.   // edge intersection vertices (indices to vertex_list)
  87.   int eixi, eiyi, eizi;
  88.   
  89.   CubeTreeLeafData(void) : eixi(-1), eiyi(-1), eizi(-1), distance(-1e33) {}
  90. };
  91. class CubeTreeLeaf: public CubeTreeBase {
  92.  public:
  93.   CubeTreeLeaf(const Pnt3 &c, float s,
  94.        CubeTree* parent, int iParIdx,
  95.        vector<RigidScan*>& views);
  96.   virtual ~CubeTreeLeaf();
  97.  protected:
  98.   // get list for boundary triangles
  99.   virtual void extract_faces (vector<int> &tri_inds);
  100.   virtual void keep_walls (bool x, bool y, bool z);
  101.   OccSt          neighbor_status  (int face, int child);
  102.   bool           is_neighbor_cell (int face, int& child);
  103.   CubeTreeBase*  recursive_find   (int face, stack<int>& path, 
  104.    bool bReachedTop);
  105.   CubeTreeLeaf*  find_neighbor    (int face);
  106.   friend class CubeTreeBase;
  107.   friend class CubeTree;
  108.  private:
  109.   CubeTreeLeafData* data;
  110.   // stuff for accessing children... 
  111.   // could also be computed each time
  112.   int   mask;
  113.   int   nLeavesPerSide;
  114. };
  115. #endif