taper.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:5k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* 
  2.  * taper.c
  3.  * 
  4.  * FUNCTION:
  5.  * Draws a tapered screw shape.
  6.  *
  7.  * HISTORY:
  8.  * -- created by Linas Vepstas October 1991
  9.  * -- heavily modified to draw more texas shapes, Feb 1993, Linas
  10.  * -- converted to use GLUT -- December 1995, Linas
  11.  *
  12.  */
  13. /* required include files */
  14. #include <stdlib.h>
  15. #include <math.h>
  16. #include <GL/glut.h>
  17. #include <GL/tube.h>
  18. /* Some <math.h> files do not define M_PI... */
  19. #ifndef M_PI
  20. #define M_PI 3.14159265358979323846
  21. #endif
  22. /* =========================================================== */
  23. #define SCALE 3.33333
  24. #define CONTOUR(x,y) {
  25.    double ax, ay, alen;
  26.    contour[i][0] = SCALE * (x);
  27.    contour[i][1] = SCALE * (y);
  28.    if (i!=0) {
  29.       ax = contour[i][0] - contour[i-1][0];
  30.       ay = contour[i][1] - contour[i-1][1];
  31.       alen = 1.0 / sqrt (ax*ax + ay*ay);
  32.       ax *= alen;   ay *= alen;
  33.       norms [i-1][0] = ay;
  34.       norms [i-1][1] = -ax;
  35.    }
  36.    i++;
  37. }
  38. #define NUM_PTS (25)
  39. double contour [NUM_PTS][2];
  40. double norms [NUM_PTS][2];
  41. void init_contour (void)
  42. {
  43.    int i;
  44.    /* outline of extrusion */
  45.    i=0;
  46.    CONTOUR (1.0, 1.0);
  47.    CONTOUR (1.0, 2.9);
  48.    CONTOUR (0.9, 3.0);
  49.    CONTOUR (-0.9, 3.0);
  50.    CONTOUR (-1.0, 2.9);
  51.    CONTOUR (-1.0, 1.0);
  52.    CONTOUR (-2.9, 1.0);
  53.    CONTOUR (-3.0, 0.9);
  54.    CONTOUR (-3.0, -0.9);
  55.    CONTOUR (-2.9, -1.0);
  56.    CONTOUR (-1.0, -1.0);
  57.    CONTOUR (-1.0, -2.9);
  58.    CONTOUR (-0.9, -3.0);
  59.    CONTOUR (0.9, -3.0);
  60.    CONTOUR (1.0, -2.9);
  61.    CONTOUR (1.0, -1.0);
  62.    CONTOUR (2.9, -1.0);
  63.    CONTOUR (3.0, -0.9);
  64.    CONTOUR (3.0, 0.9);
  65.    CONTOUR (2.9, 1.0);
  66.    CONTOUR (1.0, 1.0);   /* repeat so that last normal is computed */
  67. }
  68.    
  69. /* =========================================================== */
  70. #define PSIZE 40
  71. double path[PSIZE][3];
  72. double twist[PSIZE];
  73. double taper[PSIZE];
  74. void init_taper (void) {
  75.    int j;
  76.    double z, deltaz;
  77.    double ang, dang;
  78.    z = -10.0;
  79.    deltaz = 0.5;
  80.    ang = 0.0;
  81.    dang = 20.0;
  82.    for (j=0; j<40; j++) {
  83.       path[j][0] = 0x0;
  84.       path[j][1] = 0x0;
  85.       path[j][2] = z;
  86.       twist[j] = ang;
  87.       ang += dang;
  88.       taper[j] = 0.1 * sqrt (9.51*9.51 - z*z);
  89.       z += deltaz;
  90.    }
  91.    taper[0] = taper[1];
  92.    taper[39] = taper[38];
  93. }
  94. /* =========================================================== */
  95. extern float lastx;
  96. extern float lasty;
  97. void InitStuff (void)
  98. {
  99.    int style;
  100.    /* configure the pipeline */
  101.    style = TUBE_JN_CAP;
  102.    style |= TUBE_CONTOUR_CLOSED;
  103.    style |= TUBE_NORM_FACET;
  104.    style |= TUBE_JN_ANGLE;
  105.    gleSetJoinStyle (style);
  106.    lastx = 121.0;
  107.    lasty = 121.0;
  108.    init_contour();
  109.    init_taper();
  110. }
  111. /* =========================================================== */
  112. void gleTaper (int ncp, 
  113.                gleDouble contour[][2], 
  114.                gleDouble cont_normal[][2], 
  115.                gleDouble up[3],
  116.                int npoints,
  117.                gleDouble point_array[][3],
  118.                float color_array[][3],
  119.                gleDouble taper[],
  120.                gleDouble twist[])
  121. {
  122.    int j;
  123.    gleAffine *xforms;
  124.    double co, si, angle;
  125.    /* malloc the extrusion array and the twist array */
  126.    xforms = (gleAffine *) malloc (npoints * sizeof(gleAffine));
  127.    for (j=0; j<npoints; j++) {
  128.       angle = (M_PI/180.0) * twist[j];
  129.       si = sin (angle);
  130.       co = cos (angle);
  131.       xforms[j][0][0] = taper[j] * co;
  132.       xforms[j][0][1] = - taper[j] * si;
  133.       xforms[j][0][2] = 0.0;
  134.       xforms[j][1][0] = taper[j] * si;
  135.       xforms[j][1][1] = taper[j] * co;
  136.       xforms[j][1][2] = 0.0;
  137.    }
  138.    gleSuperExtrusion (ncp,               /* number of contour points */
  139.                 contour,    /* 2D contour */
  140.                 cont_normal, /* 2D contour normals */
  141.                 up,           /* up vector for contour */
  142.                 npoints,           /* numpoints in poly-line */
  143.                 point_array,        /* polyline */
  144.                 color_array,        /* color of polyline */
  145.                 xforms);
  146.    free (xforms);
  147. }
  148. /* =========================================================== */
  149. void DrawStuff (void) {
  150.    int j;
  151.    double ang, dang;
  152.    double z, deltaz;
  153.    double ponent;
  154.    z=-1.0;
  155.    deltaz = 1.999/38;
  156.    ang = 0.0;
  157.    dang = lasty/40.0;
  158.    ponent = fabs (lastx/540.0);
  159.    for (j=1; j<39; j++) {
  160.       twist[j] = ang;
  161.       ang += dang;
  162.       taper[j] = pow ((1.0 - pow (fabs(z), 1.0/ponent)), ponent);
  163.       z += deltaz;
  164.    }
  165.    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  166.    glColor3f (0.5, 0.6, 0.6);
  167.    /* set up some matrices so that the object spins with the mouse */
  168.    glPushMatrix ();
  169.    glTranslatef (0.0, 0.0, -80.0);
  170.    glRotatef (130.0, 0.0, 1.0, 0.0);
  171.    glRotatef (65.0, 1.0, 0.0, 0.0);
  172.    /* draw the brand and the handle */
  173.    gleTaper (20, contour, norms,  NULL, 40, path, NULL, taper, twist);
  174.    glPopMatrix ();
  175.    glutSwapBuffers ();
  176. }
  177. /* ===================== END OF FILE ================== */