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

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. static int mx = 121;
  23. static int my = 121;
  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 draw_twist (void) {
  120.    int i;
  121.    toid1_twists[2] = (double) (mx-121) / 8.0;
  122.    i=3;
  123. /*
  124.    TPTS (1.0, ((double)my) /400.0);
  125.    TPTS (1.1, 1.1 * ((double)my) / 400.0);
  126. */
  127.    TPTS (1.0, -((double)(my-121)) /200.0);
  128.    TPTS (1.1, -1.1 * ((double)(my-121)) / 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 init_twist (void)
  158. {
  159.    int js;
  160.    init_toid1_line ();
  161.    init_tripples ();
  162. #ifdef IBM_GL_32
  163.    js = getjoinstyle ();
  164.    js &= ~TUBE_CONTOUR_CLOSED;
  165.    setjoinstyle (js);
  166. #endif
  167. #ifdef OPENGL_10
  168.    js = gleGetJoinStyle ();
  169.    js &= ~TUBE_CONTOUR_CLOSED;
  170.    gleSetJoinStyle (js);
  171. #endif
  172. }
  173. /* get notified of mouse motions */
  174. void MouseMotion (int x, int y)
  175. {
  176.    mx = x;
  177.    my = y;
  178.    glutPostRedisplay ();
  179. }
  180. void JoinStyle (int msg) 
  181. {
  182.    int style;
  183.    /* get the current joint style */
  184.    style = gleGetJoinStyle ();
  185.    /* there are four different join styles, 
  186.     * and two different normal vector styles */
  187.    switch (msg) {
  188.       case 0:
  189.          style &= ~TUBE_JN_MASK;
  190.          style |= TUBE_JN_RAW;
  191.          break;
  192.       case 1:
  193.          style &= ~TUBE_JN_MASK;
  194.          style |= TUBE_JN_ANGLE;
  195.          break;
  196.       case 2:
  197.          style &= ~TUBE_JN_MASK;
  198.          style |= TUBE_JN_CUT;
  199.          break;
  200.       case 3:
  201.          style &= ~TUBE_JN_MASK;
  202.          style |= TUBE_JN_ROUND;
  203.          break;
  204.       case 20:
  205.          style &= ~TUBE_NORM_MASK;
  206.          style |= TUBE_NORM_FACET;
  207.          break;
  208.       case 21:
  209.          style &= ~TUBE_NORM_MASK;
  210.          style |= TUBE_NORM_EDGE;
  211.          break;
  212.       case 99:
  213.          exit (0);
  214.       default:
  215.          break;
  216.    }
  217.    gleSetJoinStyle (style);
  218.    glutPostRedisplay ();
  219. }
  220. /* set up a light */
  221. GLfloat lightOnePosition[] = {40.0, 40, 100.0, 0.0};
  222. GLfloat lightOneColor[] = {0.89, 0.89, 0.89, 1.0}; 
  223. GLfloat lightTwoPosition[] = {-40.0, 40, 100.0, 0.0};
  224. GLfloat lightTwoColor[] = {0.89, 0.89, 0.89, 1.0}; 
  225. GLfloat material[] = {0.93, 0.79, 0.93, 1.0}; 
  226. int
  227. main (int argc, char * argv[]) {
  228.    /* initialize glut */
  229.    glutInit (&argc, argv);
  230.    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  231.    glutCreateWindow ("twistoid");
  232.    glutDisplayFunc (draw_twist);
  233.    glutMotionFunc (MouseMotion);
  234.    /* create popup menu */
  235.    glutCreateMenu (JoinStyle);
  236.    glutAddMenuEntry ("Raw Join Style", 0);
  237.    glutAddMenuEntry ("Angle Join Style", 1);
  238.    glutAddMenuEntry ("Cut Join Style", 2);
  239.    glutAddMenuEntry ("Round Join Style", 3);
  240.    glutAddMenuEntry ("------------------", 9999);
  241.    glutAddMenuEntry ("Facet Normal Vectors", 20);
  242.    glutAddMenuEntry ("Edge Normal Vectors", 21);
  243.    glutAddMenuEntry ("------------------", 9999);
  244.    glutAddMenuEntry ("Exit", 99);
  245.    glutAttachMenu (GLUT_MIDDLE_BUTTON);
  246.    /* initialize GL */
  247.    glClearDepth (1.0);
  248.    glEnable (GL_DEPTH_TEST);
  249.    glClearColor (0.2, 0.2, 0.2, 0.0);
  250.    glShadeModel (GL_SMOOTH);
  251.    glMatrixMode (GL_PROJECTION);
  252.    /* roughly, measured in centimeters */
  253.    glFrustum (-9.0, 9.0, -9.0, 9.0, 50.0, 150.0);
  254.    glMatrixMode(GL_MODELVIEW);
  255.    /* initialize lighting */
  256.    glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, material);
  257.    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, material);
  258.    glLightfv (GL_LIGHT0, GL_POSITION, lightOnePosition);
  259.    glLightfv (GL_LIGHT0, GL_DIFFUSE, lightOneColor);
  260.    glLightfv (GL_LIGHT0, GL_SPECULAR, lightOneColor);
  261.    glEnable (GL_LIGHT0);
  262.    glLightfv (GL_LIGHT1, GL_POSITION, lightTwoPosition);
  263.    glLightfv (GL_LIGHT1, GL_DIFFUSE, lightTwoColor);
  264.    glEnable (GL_LIGHT1);
  265.    glEnable (GL_LIGHTING);
  266. /*
  267.    glColorMaterial (GL_FRONT_AND_BACK, GL_DIFFUSE);
  268.    glEnable (GL_COLOR_MATERIAL);
  269. */
  270.    init_twist ();
  271.    glutMainLoop ();
  272.    return 0;             /* ANSI C requires main to return int. */
  273. }
  274. /* ------------------ end of file -------------------- */