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

GIS编程

开发平台:

Visual C++

  1. /* 
  2.  * texas.c
  3.  * 
  4.  * FUNCTION:
  5.  * Draws a brand in the shape of Texas.  Both the handle, and the
  6.  * cross-section of the brand are in the shape of Texas.
  7.  *
  8.  * Note that the contours are specified in clockwise order. 
  9.  * Thus, enabling backfacing polygon removal will cause the front
  10.  * polygons to disappear.
  11.  *
  12.  * HISTORY:
  13.  * -- created by Linas Vepstas October 1991
  14.  * -- heavily modified to draw more texas shapes, Feb 1993, Linas
  15.  * -- converted to use GLUT -- December 1995, Linas
  16.  *
  17.  */
  18. /* required include files */
  19. #include <stdlib.h>
  20. #include <math.h>
  21. #include <GL/glut.h>
  22. #include <GL/tube.h>
  23. /* =========================================================== */
  24. #define HNUM 4
  25. double brand_points[HNUM][3];
  26. float brand_colors [HNUM][3];
  27. #define TSCALE  4.0
  28. #define BPTS(x,y,z) {
  29.    brand_points[i][0] = TSCALE * (x);
  30.    brand_points[i][1] = TSCALE * (y);
  31.    brand_points[i][2] = TSCALE * (z);
  32.    i++;
  33. }
  34. #define BCOLS(r,g,b) {
  35.    brand_colors[i][0] = (r);  
  36.    brand_colors[i][1] = (g);
  37.    brand_colors[i][2] = (b);
  38.    i++;
  39. }
  40. #define NUMPOINTS 18
  41. double tspine[NUMPOINTS][3];
  42. float tcolors [NUMPOINTS][3];
  43. #define TPTS(x,y) {
  44.    tspine[i][0] = TSCALE * (x);
  45.    tspine[i][1] = TSCALE * (y);
  46.    tspine[i][2] = TSCALE * (0.0);
  47.    i++;
  48. }
  49. #define TCOLS(r,g,b) {
  50.    tcolors[i][0] = (r);
  51.    tcolors[i][1] = (g);
  52.    tcolors[i][2] = (b);
  53.    i++;
  54. }
  55. /* =========================================================== */
  56. void init_spine (void)
  57. {
  58.    int i;
  59.    int ir, ig, ib;
  60.    float r, g, b;
  61.    i=0;
  62.    TPTS (-1.5, 2.0); /* panhandle */
  63.    TPTS (-0.75, 2.0);
  64.    TPTS (-0.75, 1.38);
  65.    TPTS (-0.5, 1.25);
  66.    TPTS (0.88, 1.12);
  67.    TPTS (1.0, 0.62);
  68.    TPTS (1.12, 0.1);
  69.    TPTS (0.5, -0.5);
  70.    TPTS (0.2, -1.12); /* corpus */
  71.    TPTS (0.3, -1.5); /* brownsville */
  72.    TPTS (-0.25, -1.45);
  73.    TPTS (-1.06, -0.3);
  74.    TPTS (-1.38, -0.3);
  75.    TPTS (-1.65, -0.6);
  76.    TPTS (-2.5, 0.5);   /* midland */
  77.    TPTS (-1.5, 0.5);
  78.    TPTS (-1.5, 2.0); /* panhandle */
  79.    TPTS (-0.75, 2.0);
  80.    ir = ig = ib = 0;
  81.    for (i=0; i<NUMPOINTS; i++) {
  82.       ir += 33; ig +=47; ib +=89;
  83.       ir %= 255; ig %= 255; ib %= 255;
  84.       r = ((float) ir) / 255.0;
  85.       g = ((float) ig) / 255.0;
  86.       b = ((float) ib) / 255.0;
  87.       
  88.       tcolors[i][0] = (r);
  89.       tcolors[i][1] = (g);
  90.       tcolors[i][2] = (b);
  91.    }
  92.    i=0;
  93.    BPTS (0.0, 0.0, 0.1);
  94.    BPTS (0.0, 0.0, 0.0);
  95.    BPTS (0.0, 0.0, -5.0);
  96.    BPTS (0.0, 0.0, -5.1);
  97.    i=0;
  98.    BCOLS (1.0, 0.3, 0.0);
  99.    BCOLS (1.0, 0.3, 0.0);
  100.    BCOLS (1.0, 0.3, 0.0);
  101.    BCOLS (1.0, 0.3, 0.0);
  102. }
  103. /* =========================================================== */
  104. #define SCALE 0.8
  105. #define BORDER(x,y) {
  106.    double ax, ay, alen;
  107.    texas_xsection[i][0] = SCALE * (x);
  108.    texas_xsection[i][1] = SCALE * (y);
  109.    if (i!=0) {
  110.       ax = texas_xsection[i][0] - texas_xsection[i-1][0];
  111.       ay = texas_xsection[i][1] - texas_xsection[i-1][1];
  112.       alen = 1.0 / sqrt (ax*ax + ay*ay);
  113.       ax *= alen;   ay *= alen;
  114.       texas_normal [i-1][0] = - ay;
  115.       texas_normal [i-1][1] = ax;
  116.    }
  117.    i++;
  118. }
  119. #define NUM_TEXAS_PTS (17)
  120. double texas_xsection [NUM_TEXAS_PTS][2];
  121. double texas_normal [NUM_TEXAS_PTS][2];
  122. void init_xsection (void)
  123. {
  124.    int i;
  125.    /* outline of extrusion */
  126.    i=0;
  127.    BORDER (-0.75, 2.0);
  128.    BORDER (-0.75, 1.38);
  129.    BORDER (-0.5, 1.25);
  130.    BORDER (0.88, 1.12);
  131.    BORDER (1.0, 0.62);
  132.    BORDER (1.12, 0.1);
  133.    BORDER (0.5, -0.5);
  134.    BORDER (0.2, -1.12); /* corpus */
  135.    BORDER (0.3, -1.5); /* brownsville */
  136.    BORDER (-0.25, -1.45);
  137.    BORDER (-1.06, -0.3);
  138.    BORDER (-1.38, -0.3);
  139.    BORDER (-1.65, -0.6);
  140.    BORDER (-2.5, 0.5);   /* midland */
  141.    BORDER (-1.5, 0.5);
  142.    BORDER (-1.5, 2.0); /* panhandle */
  143.    BORDER (-0.75, 2.0);
  144. }
  145.    
  146. /* =========================================================== */
  147. void InitStuff (void)
  148. {
  149.    int style;
  150.    /* configure the pipeline */
  151.    init_spine ();
  152.    init_xsection ();
  153.    style = TUBE_JN_CAP;
  154.    style |= TUBE_CONTOUR_CLOSED;
  155.    style |= TUBE_NORM_FACET;
  156.    style |= TUBE_JN_ANGLE;
  157.    gleSetJoinStyle (style);
  158. }
  159. /* =========================================================== */
  160. extern float lastx;
  161. extern float lasty;
  162. void DrawStuff (void) {
  163. #ifdef IBM_GL_32
  164.    scale (1.8, 1.8, 1.8);
  165.    lmcolor (material_mode);
  166.    (void) extrusion (NUM_TEXAS_PTS-1, texas_xsection, texas_normal, 
  167.                     NULL, NUMPOINTS, tspine, tcolors);
  168.    (void) extrusion (NUM_TEXAS_PTS-1, texas_xsection, texas_normal, 
  169.                     NULL, HNUM, brand_points, brand_colors);
  170.    lmcolor (LMC_COLOR);
  171. #endif
  172. #define OPENGL_10
  173. #ifdef OPENGL_10
  174.    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  175.    /* set up some matrices so that the object spins with the mouse */
  176.    glPushMatrix ();
  177.    glTranslatef (0.0, 0.0, -80.0);
  178.    glRotatef (lastx, 0.0, 1.0, 0.0);
  179.    glRotatef (lasty, 1.0, 0.0, 0.0);
  180.    /* draw the brand and the handle */
  181.    gleExtrusion (NUM_TEXAS_PTS-1, texas_xsection, texas_normal, 
  182.                  NULL, NUMPOINTS, tspine, tcolors);
  183.    gleExtrusion (NUM_TEXAS_PTS-1, texas_xsection, texas_normal, 
  184.                  NULL, HNUM, brand_points, brand_colors);
  185.    glPopMatrix ();
  186.    glutSwapBuffers ();
  187. }
  188. #endif
  189. /* ===================== END OF FILE ================== */