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

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // KDtritree.h
  3. // Kari Pulli
  4. // 11/19/98
  5. // A KD tree for spheres, the leaf spheres contain triangles.
  6. // When creating, use KD-tree partitioning, when returning
  7. // from recursion, find bounding spheres.
  8. //############################################################
  9. #ifndef _KDTRITREE_H_
  10. #define _KDTRITREE_H_
  11. #include "Pnt3.h"
  12. #include <vector.h>
  13. struct KDsphere {
  14.   int   ind;
  15.   Pnt3  ctr;
  16.   float radius;
  17. };
  18. class KDtritree {
  19. private:
  20.   Pnt3  ctr;
  21.   float radius;
  22.   // if leaf, use ind to tell where the indices for
  23.   // the triangle are, else use to tell which dimension
  24.   // was used in splitting
  25.   int   ind;
  26.   float split; // on which coordinate did the split happen
  27.   
  28.   KDtritree  *child[2];
  29.   void collapse_spheres(void);
  30.   void _search(const Pnt3 *pts, const int *inds, 
  31.        const Pnt3 &p, Pnt3 &cp, float &d2) const;
  32.   
  33. public:
  34.   KDtritree(const Pnt3 *pts, const int *triinds, 
  35.     KDsphere *spheres, int n, int first = 1);
  36.   ~KDtritree();
  37.   // just find the closest point
  38.   bool search(const Pnt3 *pts, const int *inds, const Pnt3 &p,
  39.       Pnt3 &cp, float &d) const
  40.     {
  41.       float d2 = d*d;
  42.       _search(pts, inds, p, cp, d2);
  43.       if (d*d!=d2) {
  44. d = sqrtf(d2);
  45. return true;
  46.       } else {
  47. return false;
  48.       }
  49.     }
  50. };
  51. KDtritree *
  52. create_KDtritree(const Pnt3 *pts, const int *inds, int n);
  53. #endif