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

3D图形编程

开发平台:

Visual C++

  1. #include "WorkingVolume.h"
  2. #include "CyberScan.h"
  3. CyberWorkingVolume theCyberWorkingVolume;
  4. void
  5. CyberWorkingVolume::use(RigidScan *rscan)
  6. {
  7.    CyberScan *cscan = (CyberScan *) rscan;
  8.    scanVertical = cscan->get_scanner_vertical();
  9.    scanConfig   = cscan->get_scanner_config();
  10.    scanXform    = cscan->getXform();
  11.    bounds(wvVert, wvHorInc, wvHorMin, wvHorMax, wvRotMin, wvRotMax,
  12.           wvMotMin, wvMotMax);
  13. }
  14. #define YMIN 30     // 8
  15. #define YMID 244
  16. #define YMAX 400    // 479
  17. #define ZMIN 80     // 60
  18. #define ZMID 1500
  19. #define ZMAX 2900   // 2939
  20. #define WV_ROT_INC 10.0      // Screw distance (mm) between points
  21. void
  22. CyberWorkingVolume::bounds(float vert, float hor_inc, float hor_min,
  23.    float hor_max, float rot_min, float rot_max, float mot_min, float mot_max)
  24. {
  25.    CyberXform xf;
  26.    float h, r, m;
  27.    int mc, rc;
  28.    float vertDelta;
  29.    wvNumShells = wvNumRots = wvNumMots = 0;
  30.    wvVert = vert;
  31.    wvHorInc = hor_inc;
  32.    wvHorMin = hor_min;
  33.    wvHorMax = hor_max;
  34.    wvRotMin = rot_min;
  35.    wvRotMax = rot_max;
  36.    wvMotMin = mot_min;
  37.    wvMotMax = mot_max;
  38.    vertDelta = wvVert - scanVertical;
  39.    // Determine the horizontal translation vector by
  40.    // checking the displacement between two points.
  41.    xf.setup(scanConfig, 0, 0, 0);
  42.    xf.set_screw(0.0);
  43.    Pnt3 p1 = xf.apply_xform(YMID, ZMID);
  44.    xf.setup(scanConfig, 825.0, 0, 0);
  45.    xf.set_screw(0.0);
  46.    Pnt3 p2 = xf.apply_xform(YMID, ZMID);
  47.    wvHorTransX = (p2[0] - p1[0]) / 825.0;
  48.    wvHorTransY = (p2[1] - p1[1]) / 825.0;
  49.    wvHorTransZ = (p2[2] - p1[2]) / 825.0;
  50.    // Count the number of shells in the working volume
  51.    for (h=wvHorMin; h<=wvHorMin + wvHorInc*ceilf((wvHorMax-wvHorMin)/wvHorInc);
  52. h+=wvHorInc) ++wvNumShells;
  53.    // Precompute the sample points defining the shell located
  54.    // at horizontal position = wvHorMin.
  55.    xf.setup(scanConfig, wvHorMin, wvRotMin, vertDelta);
  56.    for (m=wvMotMin, mc=0; m<wvMotMax; m+=WV_ROT_INC, ++mc)  {
  57.       xf.set_screw(m);
  58.       xf.apply_xform(YMIN, ZMIN, corner[0][mc][0]);
  59.       xf.apply_xform(YMIN, ZMAX, corner[0][mc][1]);
  60.    }
  61.    xf.set_screw(wvMotMax);
  62.    xf.apply_xform(YMIN, ZMIN, corner[0][mc][0]);
  63.    xf.apply_xform(YMIN, ZMAX, corner[0][mc][1]);
  64.    for (r=wvRotMin, rc=1; r<=wvRotMax; r+=WV_ROT_INC, ++rc)
  65.    {
  66.       xf.setup(scanConfig, wvHorMin, r, vertDelta);
  67.       for (m=wvMotMin, mc=0; m<wvMotMax; m+=WV_ROT_INC, ++mc)  {
  68.           xf.set_screw(m);
  69.           xf.apply_xform(YMID, ZMIN, corner[rc][mc][0]);
  70.           xf.apply_xform(YMID, ZMAX, corner[rc][mc][1]);
  71.       }
  72.       xf.set_screw(wvMotMax);
  73.       xf.apply_xform(YMID, ZMIN, corner[rc][mc][0]);
  74.       xf.apply_xform(YMID, ZMAX, corner[rc][mc][1]);
  75.    }
  76.    xf.setup(scanConfig, wvHorMin, wvRotMax, vertDelta);
  77.    for (m=wvMotMin, mc=0; m<wvMotMax; m+=WV_ROT_INC, ++mc)  {
  78.       xf.set_screw(m);
  79.       xf.apply_xform(YMAX, ZMIN, corner[rc][mc][0]);
  80.       xf.apply_xform(YMAX, ZMAX, corner[rc][mc][1]);
  81.    }
  82.    xf.set_screw(wvMotMax);
  83.    xf.apply_xform(YMAX, ZMIN, corner[rc][mc][0]);
  84.    xf.apply_xform(YMAX, ZMAX, corner[rc][mc][1]);
  85.    wvNumRots = rc + 1;
  86.    wvNumMots = mc + 1;
  87. }
  88. void
  89. CyberWorkingVolume::drawthis(void)
  90. {
  91.    int i, j, k;
  92.    glDisable(GL_LIGHTING);
  93.    glDisable(GL_CULL_FACE);
  94.    // Assuming glMatrixMode is GL_MODELVIEW...
  95.    glPushMatrix();
  96.    glMultMatrixf((float *)scanXform);  // Apply the alignment transformation
  97.    for (i=0; i<wvNumShells; ++i)  {
  98.       // If in line mode, just draw line segments through each shell
  99.       if (wvDrawMode) {
  100.          glColor3f(1,0,0);
  101.  glBegin(GL_LINES);
  102.  for (j=0; j<wvNumRots; ++j)
  103.             for (k=0; k<wvNumMots; ++k)  {
  104.        glVertex3fv(corner[j][k][0]);
  105.        glVertex3fv(corner[j][k][1]);
  106.     }
  107.          glEnd();
  108.       }
  109.       else {
  110.    // Bottom
  111.    glColor3f(1,0,0);
  112.    for (j=0; j<wvNumRots-1; ++j)  {
  113.       glBegin(GL_POLYGON);
  114.          glVertex3fv(corner[j][0][0]);
  115.          glVertex3fv(corner[j][0][1]);
  116.          glVertex3fv(corner[j+1][0][1]);
  117.          glVertex3fv(corner[j+1][0][0]);
  118.       glEnd();
  119.    }
  120.    // Back
  121.    glColor3f(0,1,0);
  122.    for (j=0; j<wvNumRots-1; ++j)
  123.       for (k=0; k<wvNumMots-1; ++k)  {
  124.          glBegin(GL_POLYGON);
  125.             glVertex3fv(corner[j][k][1]);
  126.             glVertex3fv(corner[j][k+1][1]);
  127.             glVertex3fv(corner[j+1][k+1][1]);
  128.             glVertex3fv(corner[j+1][k][1]);
  129.          glEnd();
  130.       }
  131.    // Top
  132.    glColor3f(0,0,1);
  133.    for (j=0; j<wvNumRots-1; ++j)  {
  134.       glBegin(GL_POLYGON);
  135.          glVertex3fv(corner[j][wvNumMots-1][0]);
  136.          glVertex3fv(corner[j+1][wvNumMots-1][0]);
  137.          glVertex3fv(corner[j+1][wvNumMots-1][1]);
  138.          glVertex3fv(corner[j][wvNumMots-1][1]);
  139.       glEnd();
  140.    }
  141.    // Front
  142.    glColor3f(1,1,0);
  143.    for (j=0; j<wvNumRots-1; ++j)
  144.       for (k=0; k<wvNumMots-1; ++k)  {
  145.          glBegin(GL_POLYGON);
  146.             glVertex3fv(corner[j][k][0]);
  147.             glVertex3fv(corner[j+1][k][0]);
  148.             glVertex3fv(corner[j+1][k+1][0]);
  149.             glVertex3fv(corner[j][k+1][0]);
  150.          glEnd();
  151.       }
  152.    // Right side
  153.    glColor3f(1,0,1);
  154.    for (j=0; j<wvNumMots-1; ++j)  {
  155.       glBegin(GL_POLYGON);
  156.          glVertex3fv(corner[wvNumRots-1][j][0]);
  157.          glVertex3fv(corner[wvNumRots-1][j][1]);
  158.          glVertex3fv(corner[wvNumRots-1][j+1][1]);
  159.          glVertex3fv(corner[wvNumRots-1][j+1][0]);
  160.       glEnd();
  161.    }
  162.       
  163.    // Left side
  164.    glColor3f(0,1,1);
  165.    for (j=0; j<wvNumMots-1; ++j)  {
  166.       glBegin(GL_POLYGON);
  167.          glVertex3fv(corner[0][j][0]);
  168.          glVertex3fv(corner[0][j+1][0]);
  169.          glVertex3fv(corner[0][j+1][1]);
  170.          glVertex3fv(corner[0][j][1]);
  171.       glEnd();
  172.    }
  173.    }
  174.    glTranslatef(wvHorInc*wvHorTransX, wvHorInc*wvHorTransY,
  175.                 wvHorInc*wvHorTransZ);
  176.    }
  177.    glPopMatrix();
  178. }
  179. CyberWorkingVolume *GetCyberWorkingVolume(void)
  180. {
  181.    return &theCyberWorkingVolume;
  182. }