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

GIS编程

开发平台:

Visual C++

  1. /* 
  2.  * twistoid.c
  3.  *
  4.  * FUNCTION:
  5.  * Show extrusion of open contours. Also, show how torsion is applied.
  6.  *
  7.  * HISTORY:
  8.  * -- linas Vepstas October 1991
  9.  * -- heavily modified to draw corrugated surface, Feb 1993, Linas
  10.  * -- modified to demo twistoid March 1993
  11.  * -- port to glut Linas Vepstas March 1995
  12.  */
  13. /* required include files */
  14. #include <math.h>
  15. #include <stdlib.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. extern float lastx;
  23. extern float lasty;
  24. #define OPENGL_10
  25. /* =========================================================== */
  26. #define NUM_TOID1_PTS 5
  27. double toid1_points[NUM_TOID1_PTS][3];
  28. float toid1_colors [NUM_TOID1_PTS][3];
  29. double toid1_twists [NUM_TOID1_PTS];
  30. #define TSCALE (6.0)
  31. #define TPTS(x,y) {
  32.    toid1_points[i][0] = TSCALE * (x);
  33.    toid1_points[i][1] = TSCALE * (y);
  34.    toid1_points[i][2] = TSCALE * (0.0);
  35.    i++;
  36. }
  37. #define TCOLS(r,g,b) {
  38.    toid1_colors[i][0] = (r);
  39.    toid1_colors[i][1] = (g);
  40.    toid1_colors[i][2] = (b);
  41.    i++;
  42. }
  43. #define TXZERO() {
  44.    toid1_twists[i] = 0.0;
  45.    i++;
  46. }
  47. void init_toid1_line (void)
  48. {
  49.    int i;
  50.    i=0;
  51.    TPTS (-1.1, 0.0);
  52.    TPTS (-1.0, 0.0);
  53.    TPTS (0.0, 0.0);
  54.    TPTS (1.0, 0.0);
  55.    TPTS (1.1, 0.0);
  56.    i=0;
  57.    TCOLS (0.8, 0.8, 0.5);
  58.    TCOLS (0.8, 0.4, 0.5);
  59.    TCOLS (0.8, 0.8, 0.3);
  60.    TCOLS (0.4, 0.4, 0.5);
  61.    TCOLS (0.8, 0.8, 0.5);
  62.    i=0;
  63.    TXZERO ();
  64.    TXZERO ();
  65.    TXZERO ();
  66.    TXZERO ();
  67.    TXZERO ();
  68. }
  69. /* =========================================================== */
  70. #define SCALE 0.6
  71. #define TWIST(x,y) {
  72.    double ax, ay, alen;
  73.    twistation[i][0] = SCALE * (x);
  74.    twistation[i][1] = SCALE * (y);
  75.    if (i!=0) {
  76.       ax = twistation[i][0] - twistation[i-1][0];
  77.       ay = twistation[i][1] - twistation[i-1][1];
  78.       alen = 1.0 / sqrt (ax*ax + ay*ay);
  79.       ax *= alen;   ay *= alen;
  80.       twist_normal [i-1][0] = - ay;
  81.       twist_normal [i-1][1] = ax;
  82.    }
  83.    i++;
  84. }
  85. #define NUM_TWIS_PTS (20)
  86. double twistation [NUM_TWIS_PTS][2];
  87. double twist_normal [NUM_TWIS_PTS][2];
  88. void init_tripples (void)
  89. {
  90.    int i;
  91.    double angle;
  92.    double co, si;
  93.    /* outline of extrusion */
  94.    i=0;
  95.    /* first, draw a semi-curcular "hump" */
  96.    while (i< 11) {
  97.       angle = M_PI * ((double) i) / 10.0;
  98.       co = cos (angle);
  99.       si = sin (angle);
  100.       TWIST ((-7.0 -3.0*co), 1.8*si);
  101.    }
  102.    /* now, a zig-zag corrugation */
  103.    while (i< NUM_TWIS_PTS) {
  104.       TWIST ((-10.0 +(double) i), 0.0);
  105.       TWIST ((-9.5 +(double) i), 1.0);
  106.    }
  107. }
  108.    
  109. /* =========================================================== */
  110. #define V3F(x,y,z) {
  111. float vvv[3]; 
  112. vvv[0] = x; vvv[1] = y; vvv[2] = z; v3f (vvv); 
  113. }
  114. #define N3F(x,y,z) {
  115. float nnn[3]; 
  116. nnn[0] = x; nnn[1] = y; nnn[2] = z; n3f (nnn); 
  117. }
  118. /* =========================================================== */
  119. void DrawStuff (void) {
  120.    int i;
  121.    toid1_twists[2] = (lastx-121.0) / 8.0;
  122.    i=3;
  123. /*
  124.    TPTS (1.0, lasty /400.0);
  125.    TPTS (1.1, 1.1 * lasty / 400.0);
  126. */
  127.    TPTS (1.0, -(lasty-121.0) /200.0);
  128.    TPTS (1.1, -1.1 * (lasty-121.0) / 200.0);
  129. #ifdef IBM_GL_32
  130.    rotate (230, 'x');
  131.    rotate (230, 'y');
  132.    scale (1.8, 1.8, 1.8);
  133.    if (mono_color) {
  134.       RGBcolor (178, 178, 204);
  135.       twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal, 
  136.                 NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
  137.    } else {
  138.       twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal, 
  139.               NULL, NUM_TOID1_PTS, toid1_points, toid1_colors, toid1_twists);
  140.    }
  141. #endif
  142. #ifdef OPENGL_10
  143.    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  144.    /* set up some matrices so that the object spins with the mouse */
  145.    glPushMatrix ();
  146.    glTranslatef (0.0, 0.0, -80.0);
  147.    glRotated (43.0, 1.0, 0.0, 0.0);
  148.    glRotated (43.0, 0.0, 1.0, 0.0);
  149.    glScaled (1.8, 1.8, 1.8);
  150.    gleTwistExtrusion (NUM_TWIS_PTS, twistation, twist_normal, 
  151.               NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
  152.    glPopMatrix ();
  153.    glutSwapBuffers ();
  154. #endif
  155. }
  156. /* =========================================================== */
  157. void InitStuff (void) {
  158.    int js;
  159.    init_toid1_line ();
  160.    init_tripples ();
  161. #ifdef IBM_GL_32
  162.    js = getjoinstyle ();
  163.    js &= ~TUBE_CONTOUR_CLOSED;
  164.    setjoinstyle (js);
  165. #endif
  166. #ifdef OPENGL_10
  167.    js = gleGetJoinStyle ();
  168.    js &= ~TUBE_CONTOUR_CLOSED;
  169.    gleSetJoinStyle (js);
  170. #endif
  171. }
  172. /* ------------------ end of file -------------------- */