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

GIS编程

开发平台:

Visual C++

  1. /* cylinder drawing demo */
  2. /* this demo demonstrates the various join styles */
  3. /* required include files */
  4. #include <GL/glut.h>
  5. #include <GL/tube.h>
  6. /* ------------------------------------------------------- */
  7. /* the arrays in which we will store the polyline */
  8. #define NPTS 100
  9. double points [NPTS][3];
  10. float colors [NPTS][3];
  11. int idx = 0;
  12. /* some utilities for filling that array */
  13. #define PSCALE 0.5
  14. #define PNT(x,y,z) { 
  15.    points[idx][0] = PSCALE * x; 
  16.    points[idx][1] = PSCALE * y; 
  17.    points[idx][2] = PSCALE * z;
  18.    idx ++;
  19. }
  20. #define COL(r,g,b) { 
  21.    colors[idx][0] = r; 
  22.    colors[idx][1] = g; 
  23.    colors[idx][2] = b;
  24. }
  25. /* the arrays in which we will store the contour */
  26. #define NCONTOUR 100
  27. double contour_points [NCONTOUR][2];
  28. int cidx = 0;
  29. /* some utilities for filling that array */
  30. #define C_PNT(x,y) { 
  31.    contour_points[cidx][0] = x;
  32.    contour_points[cidx][1] = y; 
  33.    cidx ++;
  34. }
  35. /* ------------------------------------------------------- */
  36. /* 
  37.  * Initialize a bent shape with three segments. 
  38.  * The data format is a polyline.
  39.  *
  40.  * NOTE that neither the first, nor the last segment are drawn.
  41.  * The first & last segment serve only to determine that angle 
  42.  * at which the endcaps are drawn.
  43.  */
  44. void InitStuff (void) {
  45.    COL (0.0, 0.0, 0.0);
  46.    PNT (16.0, 0.0, 0.0);
  47.    COL (0.2, 0.8, 0.5);
  48.    PNT (0.0, -16.0, 0.0);
  49.    COL (0.0, 0.8, 0.3);
  50.    PNT (-16.0, 0.0, 0.0);
  51.    COL (0.8, 0.3, 0.0);
  52.    PNT (0.0, 16.0, 0.0);
  53.    COL (0.2, 0.3, 0.9);
  54.    PNT (16.0, 0.0, 0.0);
  55.    COL (0.2, 0.8, 0.5);
  56.    PNT (0.0, -16.0, 0.0);
  57.    COL (0.0, 0.0, 0.0);
  58.    PNT (-16.0, 0.0, 0.0);
  59.    C_PNT (-0.8, -0.5);
  60.    C_PNT (-1.8, 0.0);
  61.    C_PNT (-1.2, 0.3);
  62.    C_PNT (-0.7, 0.8);
  63.    C_PNT (-0.2, 1.3);
  64.    C_PNT (0.0, 1.6);
  65.    C_PNT (0.2, 1.3);
  66.    C_PNT (0.7, 0.8);
  67.    C_PNT (1.2, 0.3);
  68.    C_PNT (1.8, 0.0);
  69.    C_PNT (0.8, -0.5);
  70.    gleSetJoinStyle (TUBE_JN_ANGLE | TUBE_CONTOUR_CLOSED | TUBE_JN_CAP);
  71. }
  72. double up_vector[3] = {1.0, 0.0, 0.0};
  73. extern float lastx;
  74. extern float lasty;
  75. /* ------------------------------------------------------- */
  76. /* draw the extrusion */
  77. void DrawStuff (void) {
  78.    double moved_contour [NCONTOUR][2];
  79.    int style, save_style;
  80.    int i;
  81.    for (i=0; i<cidx; i++) {
  82.       moved_contour[i][0] = contour_points [i][0];
  83.       moved_contour[i][1] = contour_points [i][1] + 0.05 * (lasty-200.0);
  84.    }
  85.    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  86.    /* set up some matrices so that the object spins with the mouse */
  87.    glPushMatrix ();
  88.    glTranslatef (0.0, 4.0, -80.0);
  89.    glRotatef (0.5*lastx, 0.0, 1.0, 0.0);
  90.    gleExtrusion (cidx, moved_contour, contour_points, up_vector, 
  91.                  idx, points, colors);
  92.    glPopMatrix ();
  93.    /* draw a seond copy, this time with the raw style, to compare
  94.     * things against */
  95.    glPushMatrix ();
  96.    glTranslatef (0.0, -4.0, -80.0);
  97.    glRotatef (0.5*lastx, 0.0, 1.0, 0.0);
  98.    save_style = gleGetJoinStyle ();
  99.    style = save_style;
  100.    style &= ~TUBE_JN_MASK;
  101.    style |= TUBE_JN_RAW;
  102.    gleSetJoinStyle (style);
  103.    gleExtrusion (cidx, moved_contour, contour_points, up_vector, 
  104.                  idx, points, colors);
  105.    gleSetJoinStyle (save_style);
  106.    glPopMatrix ();
  107.    glutSwapBuffers ();
  108. }
  109. /* ------------------ end of file ----------------------------- */