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

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // 
  3. // CyraScan.h
  4. //
  5. // Lucas Pereira
  6. // Thu Jul 16 16:09:38 1998
  7. //
  8. // Store range scan information from a Cyra Cyrax Beta 
  9. // time-of-flight laser range scanner.
  10. //
  11. //############################################################
  12. #ifndef _CyraSCAN_H_
  13. #define _CyraSCAN_H_
  14. #include "RigidScan.h"
  15. #include "CyraResLevel.h"
  16. class KDtritree;
  17. //////////////////////////////////////////////////////////////////////
  18. // CyraScan (all resolution levels for a cyra scan)
  19. //////////////////////////////////////////////////////////////////////
  20. class CyraScan : public RigidScan {
  21. public:
  22.   CyraScan(void);
  23.   ~CyraScan(void);
  24.   
  25.   // perVertex: colors and normals for every vertex (not every 3)
  26.   // stripped: triangle strips instead of triangles
  27.   // color: one of the above enum values
  28.   // colorsize: # of bytes for color: 1 = intensity,
  29.   //              2 = intensity+alpha, 3 = rgb, 4 = rgba
  30.   virtual MeshTransport* mesh(bool         perVertex = true,
  31.       bool         stripped  = true,
  32.       ColorSource  color = colorNone,
  33.       int          colorSize = 3);
  34.   int num_vertices();
  35.   int num_vertices(int resNum);
  36.   int num_tris();
  37.   int num_tris(int resNum);
  38.   bool load_resolution (int iRes);
  39.   void computeBBox (void);
  40.   void flipNormals (void);
  41.   bool read(const crope &fname);
  42.   bool write(const crope &fname);
  43.   bool ReadPts(const crope &fname); // Read a .pts file
  44.   bool WritePts(const crope &fname); // Write a .pts file
  45.   RigidScan* filtered_copy(const VertexFilter& filter);
  46.   bool filter_inplace(const VertexFilter& filter);
  47.   // for ICP...
  48.   void subsample_points(float rate, vector<Pnt3> &p, vector<Pnt3> &n);
  49.   bool closest_point(const Pnt3 &p, const Pnt3 &n, 
  50.      Pnt3 &cp, Pnt3 &cn,
  51.      float thr = 1e33, bool bdry_ok = 0);
  52.   // for volumetric processing
  53.   virtual float 
  54.   closest_point_on_mesh(const Pnt3 &p, Pnt3 &cl_pnt, OccSt &status_p);
  55.   virtual float 
  56.   closest_along_line_of_sight(const Pnt3 &p, Pnt3 &cp, 
  57.       OccSt &status_p);
  58.   virtual OccSt carve_cube  (const Pnt3 &ctr, float side);
  59.   //void TriOctreeMesh(vector<Pnt3> &p, vector<int> &ind); // for debugging...
  60. private:
  61.   vector<CyraResLevel> levels;
  62.   KDtritree   *triKD;
  63.   MeshTransport* triKD_mesh;
  64.   void build_vrip_accelerators();
  65.   vector<Pnt3> pntdir;  // normalized point values for vripping
  66.   vector<float> pntmag; // and the magnitudes that we divided out
  67.   vector< vector< vector< int> > > bins;
  68.   float minx, maxx, miny, maxy;
  69.   float binw, binh;
  70.   // PUSH_TRI:  Used by the mesh routines to push a triangle
  71.   // onto the end of the tri_inds vector, doing triangle strips
  72.   // if necessary.
  73.   inline void PUSH_TRI(int &ov2, int &ov3, vector<int> &tri_inds,
  74.        const bool stripped,  
  75.        const vector<int> &vert_inds,
  76.        const int v1, const int v2, const int v3);
  77. };
  78. #endif /* _CyraSCAN_H_ */