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

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // 
  3. // CyraResLevel.h
  4. //
  5. // Lucas Pereira
  6. // Thu Jul 16 16:09:38 1998
  7. //
  8. // Part of CyraScan.h:
  9. //    Store range scan information from a Cyra Cyrax Beta 
  10. //    time-of-flight laser range scanner.
  11. //
  12. //############################################################
  13. #ifndef _CyraResLevel_H_
  14. #define _CyraResLevel_H_
  15. #include <stdio.h>
  16. #include "RigidScan.h"
  17. class KDindtree;
  18. // confidence  = 1 / (Std.Dev + 1)
  19. // Assume Cyra has initial stddev of 20mm
  20. #define CYRA_CONF_EPS 0.1
  21. #define CYRA_DEFAULT_CONFIDENCE (CYRA_CONF_EPS / (20.0 + CYRA_CONF_EPS))
  22. // Label the tesselation cases, based on the vertices that are
  23. // the right-angle corner of the triangle...
  24. //
  25. //    0      1      2      3      4      14     23
  26. //   ====   ====   ====   ====   ====   ====   ====  
  27. //   2  4   2 4   2--4   2 /4   2--4   2--4   2--4  
  28. //          |     | /     / |     |   | |   | /|  
  29. //   1  3   1__3   1/ 3   1__3   1 3   1_3   1/_3  
  30. typedef enum {
  31.   TESS0=0,
  32.   TESS1,
  33.   TESS2,
  34.   TESS3,
  35.   TESS4,
  36.   TESS14,
  37.   TESS23, 
  38. } CyraTess;
  39. typedef enum {
  40.   cfPOINT,
  41.   cfBOX,
  42.   cfMEDIAN, 
  43.   cfMEAN50
  44. } CyraFilter;
  45. // Store the data for each sample point
  46. class CyraSample {
  47. public:
  48.   Pnt3  vtx;
  49.   short nrm[3];
  50.   int   intensity;
  51.   float confidence; // = 0 for missing data.  Otherwise,
  52.   // consider stddev as (1/confidence - 1), or something like that
  53.   // Useful functions
  54.   CyraSample(void) {
  55.     this->zero();
  56.   }
  57.   ~CyraSample(void) {
  58.     // do nothing
  59.   }
  60.   // Zero the sample, setting default values for an invalid sample
  61.   void zero(void);
  62.   // Interpolate two other samples....
  63.   void interp(CyraSample &a, CyraSample &b);
  64.   // Interpolate three other samples, weighted .25, .5, .25...
  65.   void interp(CyraSample &a, CyraSample &b, CyraSample &c);
  66.   // Interpolate arbitrary number of samples, weighted evenly...
  67.   void interp(int nsamps, CyraSample *samps[]);
  68.   // Check if a sample is valid (e.g. nonzero)
  69.   bool isValid(void);
  70. };
  71. //////////////////////////////////////////////////////////////////////
  72. // CyraResLevel  (one resolution level for a cyra scan)
  73. //////////////////////////////////////////////////////////////////////
  74. class CyraResLevel {
  75.   int width; // Number of columns
  76.   int height; // number of rows
  77.   int numpoints; // Number of valid points
  78.   int numtris; // Number of valid tris
  79.   vector<CyraSample> points;   // array size: width*height
  80.   vector<CyraTess>   tris;     // array size: (width-1) * (height-1)
  81.   Pnt3 origin;     // The origin of the scanner's coordinate system.
  82.   // KDtree stuff for mesh alignment
  83.   bool               isDirty_cache;  // Have contents of memory changed?
  84.   vector<Pnt3>       cachedPoints;    // Contiguous array of valid points
  85.   vector<short>      cachedNorms;     // Contiguous array of valid norms
  86.   vector<bool>       cachedBoundary;  // Contiguous array of valid boundary flags
  87.   KDindtree          *kdtree;        // kdtree points into cachedPoints
  88. public:
  89.   CyraResLevel(void);
  90.   ~CyraResLevel(void);
  91.   typedef RigidScan::ColorSource ColorSource;
  92.   // perVertex: colors and normals for every vertex (not every 3)
  93.   // stripped: triangle strips instead of triangles
  94.   // color: one of the above enum values
  95.   // colorsize: # of bytes for color: 1 = intensity,
  96.   //              2 = intensity+alpha, 3 = rgb, 4 = rgba
  97.   virtual MeshTransport* mesh(bool         perVertex,
  98.       bool         stripped,
  99.       ColorSource  color,
  100.       int          colorSize);
  101.  
  102.   bool ReadPts(const crope &fname); // Read a .pts file
  103.   bool WritePts(const crope &fname); // Write a .pts file
  104.   bool grazing(Pnt3 v1, Pnt3 v2, Pnt3 v3);  // detects grazing tris
  105.   int num_vertices(void);
  106.   int num_tris(void);
  107.   void growBBox(Bbox &bbox);
  108.   void flipNormals (void);
  109.   bool filtered_copy(CyraResLevel &original, const VertexFilter& filter);
  110.   bool filter_inplace(const VertexFilter& filter);
  111.   // for ICP...
  112.   void create_kdtree(void);
  113.   void subsample_points(float rate, vector<Pnt3> &p, vector<Pnt3> &n);
  114.   bool closest_point(const Pnt3 &p, const Pnt3 &n, 
  115.      Pnt3 &cp, Pnt3 &cn,
  116.      float thr = 1e33, bool bdry_ok = 0);
  117. friend class CyraScan;
  118.   bool Subsample(CyraResLevel &original, int m, int n, CyraFilter filter);
  119. private:
  120.   // Helper functions
  121.   void CalcNormals(void);
  122.   bool PointFilter(CyraResLevel &original, int m, int n);
  123.   bool Mean50Filter(CyraResLevel &original, int m, int n);
  124.   
  125.   bool colorMesh (vector<uchar>& colors,
  126.   bool           perVertex,
  127.   ColorSource    source,
  128.   int            colorSize);
  129.   // Access functions for the arrays
  130.   inline CyraSample &point(int x, int y);
  131.   inline CyraTess   &tri(  int x, int y);
  132.   inline const CyraSample &point(int x, int y) const;
  133.   inline const CyraTess   &tri(  int x, int y) const;
  134. };
  135. //////////////////////////////////////////////////////////////////////
  136. // Access inline functions
  137. // Automatically handle the indexing into the points and tris
  138. // arrays, and do error checking and all that cool stuff
  139. //////////////////////////////////////////////////////////////////////
  140. inline CyraSample &CyraResLevel::point(int x, int y) {
  141.   int index = x * height + y;
  142.   assert(index < points.size());
  143.   return points[index];
  144. }
  145. inline CyraTess &CyraResLevel::tri(int x, int y) {
  146.   int index = x * (height-1) + y;
  147.   assert(index < tris.size());
  148.   return tris[index];
  149. }
  150. // rvalues 
  151. inline const CyraSample &CyraResLevel::point(int x, int y) const {
  152.   int index = x * height + y;
  153.   assert(index < points.size());
  154.   return points[index];
  155. }
  156. inline const CyraTess &CyraResLevel::tri(int x, int y) const {
  157.   int index = x * (height-1) + y;
  158.   assert(index < tris.size());
  159.   return tris[index];
  160. }
  161.  
  162. /// useful access macros
  163. // FOR_EACH_VERT
  164. // Basically a meta-function for CyraResLevel
  165. // Loops through valid vertices, and calls a user-defined
  166. // function.  Inside it, each of the following variables is
  167. // defined (with a local scope, so it won't overwrite if they
  168. // already exist):
  169. //      CyraSample *v  the vertex
  170. //      int vx         x value (col) of the vert (0 to W-1)
  171. //      int vy         y value (row) of the current vertex (0 to H-1)
  172. //      int vindex     incrementing index (vx*H + vy)
  173. #define FOR_EACH_VERT(userfun) 
  174.   int vx=0, vy=0; 
  175.   CyraSample *v; 
  176.   int vindex=0; 
  177.   for (vx=0; vx < this->width; vx++) { 
  178.     for (vy=0; vy < this->height; vy++, vindex++) { 
  179.       v = &(this->points[vindex]); 
  180.       if (v->confidence > 0) { 
  181.         (userfun); 
  182.       } 
  183.     } 
  184.   } 
  185. }
  186.       
  187. // FOR_EACH_TRI
  188. // Basically a meta-function for CyraResLevel
  189. // Identifies all the valid triangles, using the tesselation flags.
  190. // Inside it, each of the following variables is defined (within a
  191. // local scope, so it won't overwrite if they already exist):
  192. //      int tv1    Triangle vertex 1 (index from 0 to (WxH-W-H-1)
  193. //      int tv2    Triangle vertex 2 (index from 0 to (WxH-W-H-1)
  194. //      int tv3    Triangle vertex 3 (index from 0 to (WxH-W-H-1)
  195. //      int tx     x value of the current square (0 to width-2)
  196. //      int ty     y value of the current square (0 to height-2)
  197. //      int tindex incrementing index (tx*(H-1)+ty)
  198. #define FOR_EACH_TRI(userfun) 
  199.   int tv1=0, tv2=0, tv3=0; 
  200.   int tx=0, ty=0; 
  201.   int tindex=0; 
  202.   int v1=0, v2=0, v3=0, v4=0; 
  203.   for (tx=0; tx < this->width-1; tx++) { 
  204.     v1 = tx*(this->height) - 1; 
  205.     v2 = v1 + 1; 
  206.     v3 = v1 + this->height; 
  207.     v4 = v3+1; 
  208.     for (ty=0; ty < this->height-1; ty++, tindex++) { 
  209.       v1++; v2++; v3++; v4++; 
  210.       switch(this->tris[tindex]) { 
  211.       case TESS0: 
  212. break; 
  213.       case TESS1: 
  214. tv1= v1; tv2= v3; tv3= v2; (userfun); break; 
  215.       case TESS2: 
  216. tv1= v1; tv2= v4; tv3= v2; (userfun); break; 
  217.       case TESS3: 
  218. tv1= v1; tv2= v3; tv3= v4; (userfun); break; 
  219.       case TESS4: 
  220. tv1= v3; tv2= v4; tv3= v2; (userfun); break; 
  221.       case TESS14: 
  222. tv1= v1; tv2= v3; tv3= v2; (userfun); 
  223. tv1= v3; tv2= v4; tv3= v2; (userfun); break; 
  224.       case TESS23: 
  225. tv1= v1; tv2= v3; tv3= v4; (userfun); 
  226. tv1= v1; tv2= v4; tv3= v2; (userfun); break; 
  227.       default: 
  228. cerr << "Error: Unrecognized triangle tesselation flag " 
  229.              << this->tris[tindex] << " at grid " 
  230.      << tx << ", " << ty << "." << endl; 
  231. break; 
  232.       } 
  233.     } 
  234.   } 
  235. }
  236. #endif // CyraResLevel.h