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

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // KDindtree.h
  3. // Kari Pulli
  4. // 05/22/96
  5. // A KD tree which stores only indices to points in a 
  6. // Pointcloud
  7. //############################################################
  8. #ifndef _KDINDTREE_H_
  9. #define _KDINDTREE_H_
  10. #include "Pnt3.h"
  11. // factory:
  12. class KDindtree* CreateKDindtree (const Pnt3* pts,
  13.   const short* nrms,
  14.   int nPts);
  15. class KDindtree {
  16. private:
  17.   
  18.   int      m_d;       // discriminator, 0, 1, or 2 (for x,y,z)
  19.   float    m_p;       // partition
  20.   Pnt3     min, max;
  21.   int      Nhere;     // how many in this node
  22.   KDindtree *child[2];
  23.   int       *element;
  24.   // the center of the cone that contains the normals of the
  25.   // points in this subtree
  26.   Pnt3    normal; 
  27.   float   theta;   // the opening angle of that cone
  28.   float   cos_th_p_pi_over_4;
  29.   int _search(const Pnt3 *pts, const short *nrms,
  30.       const Pnt3 &p, const Pnt3 &n,
  31.    int &ind, float &d) const;
  32.   int _search(const Pnt3 *pts, const Pnt3 &p, 
  33.    int &ind, float &d) const;
  34.   
  35. public:
  36.   // ind is a temporary array (of length n) that contains 
  37.   // indices to pts and nrms (it is assumed that same index
  38.   // works for both arrays)
  39.   // ind is modified, 
  40.   KDindtree(const Pnt3 *pts, const short *nrms,
  41.     int *ind, int n, int first = 1);
  42.   ~KDindtree();
  43.   // use normals
  44.   int search(const Pnt3 *pts, const short *nrms,
  45.      const Pnt3 &p, const Pnt3 &n,
  46.      int &ind, float &d) const
  47.     {
  48.       float _d = d;
  49.       _search(pts, nrms, p, n, ind, d);
  50.       return (d!=_d);
  51.     }
  52.   // just find the closest point
  53.   int search(const Pnt3 *pts, const Pnt3 &p,
  54.      int &ind, float &d) const
  55.     {
  56.       float _d = d;
  57.       _search(pts, p, ind, d);
  58.       return (d!=_d);
  59.     }
  60. };
  61. #endif