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

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // 
  3. // CyberXform.h
  4. //
  5. // Kari Pulli
  6. // Fri Dec 11 11:40:42 CET 1998
  7. //
  8. // Class for transforming raw Cyberware data (the Digital 
  9. // Michelangelo scanner) into 3D, as well as projecting
  10. // 3D points into scans.
  11. // For a single turn only!
  12. //
  13. //############################################################
  14. #ifndef _CyberXform_h_
  15. #define _CyberXform_h_
  16. #include "Xform.h"
  17. class CyberXform {
  18.   //private:
  19. public:
  20.   Xform<double> raw_to_laser;
  21.   Xform<double> laser_to_scanaxis;
  22.   Xform<double> raw_to_scanaxis;
  23.   Xform<double> raw_to_scanaxis_inv;
  24.   Xform<double> scanaxis_to_horz;
  25.   Xform<double> even_xform, odd_xform;
  26.   const double *even_xf, *odd_xf, *toYZ;
  27.   bool  vertical_scan;  
  28.   // following define the laser plane before scan rotation
  29.   const double *laser_n, *laser_t; 
  30.   double n_dot_t, n_dot_q, s_dot_q;
  31.   double axdir[3], ax0[3];
  32.   double s[3]; // cross(nodaxis, laser_n)
  33.   double q[3]; // cross(nodaxis, laser_n)
  34.   double axislimit_min, axislimit_max;
  35.   double axisdist_far, axisdist_near;
  36.   double _h1, _h2, _h3, _h4;
  37.   Pnt3  laser_ctr_in_laser_coords(void);
  38.   Pnt3  laser_ctr;
  39.   void  bounds_for_circle_on_laser_in_raw(float ly, float lz, float r,
  40.   short ywin[2], short zwin[2]);
  41. public:
  42.   CyberXform(void) {}
  43.   CyberXform(unsigned config, float hor_trans, float screw,
  44.      float vert_trans = 0)
  45.     {
  46.       setup((config & 0x00000001),
  47.     (config & 0x00000002) >> 1,
  48.     (config & 0x0000000c) >> 2,
  49.     (config & 0x00000010) >> 4,
  50.     hor_trans, screw, vert_trans);
  51.     }
  52.   CyberXform(bool vscan, bool tup, int tconf, bool tright,
  53.      float hor_trans, float screw, float vert_trans = 0)
  54.     {
  55.       setup(vscan, tup, tconf, tright, hor_trans, screw, vert_trans);
  56.     }
  57.   void setup(bool vscan, bool tup, int tconf, bool tright,
  58.      float hor_trans, float screw, float vert_trans = 0);
  59.   void setup(unsigned config, float hor_trans, float screw,
  60.      float vert_trans = 0)
  61.     {
  62.       setup((config & 0x00000001),
  63.     (config & 0x00000002) >> 1,
  64.     (config & 0x0000000c) >> 2,
  65.     (config & 0x00000010) >> 4,
  66.     hor_trans, screw, vert_trans);
  67.     }
  68.   void set_screw(float even_scr, float odd_scr);
  69.   void set_screw(float even_scr);
  70.   Xform<double> get_xform_even(void)    { return even_xf; }
  71.   Xform<double> get_xform_odd(void)     { return odd_xf; }
  72.   Xform<double> set_and_get_geometric_xform(float screw);
  73.   Pnt3 apply_xform(short y, short z);
  74.   void apply_xform(short y, short z, Pnt3 &p);
  75.   Pnt3 apply_raw_to_laser(short y, short z);
  76.   float axis_project(short y, short z);
  77.   bool back_project(const Pnt3 &p_in, Pnt3 &p_out,
  78.     bool  check_frustum = true);
  79.   int  sphere_status(const Pnt3 &ctr, float r,
  80.      float &screw,
  81.      float ax_min, float ax_max,
  82.      short ywin[2], short zwin[2],
  83.      float swin[2]);
  84.   Pnt3 normal_to_laser(void)            { return Pnt3(laser_n); }
  85. };
  86. #endif