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

GIS编程

开发平台:

Visual C++

  1. /* 
  2.  * beam.c
  3.  *
  4.  * FUNCTION:
  5.  * Show how twisting 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. /* =========================================================== */
  19. #define NUM_BEAM_PTS 22 
  20. double beam_spine[NUM_BEAM_PTS][3];
  21. double beam_twists [NUM_BEAM_PTS];
  22. #define TSCALE (6.0)
  23. #define TPTS(x,y,z) {
  24.    beam_spine[i][0] = TSCALE * (x);
  25.    beam_spine[i][1] = TSCALE * (y);
  26.    beam_spine[i][2] = TSCALE * (z);
  27.    i++;
  28. }
  29. #define TXZERO() {
  30.    beam_twists[i] = 0.0;
  31. }
  32. /* =========================================================== */
  33. #define SCALE 0.1
  34. #define XSECTION(x,y) {
  35.    double ax, ay, alen;
  36.    xsection[i][0] = SCALE * (x);
  37.    xsection[i][1] = SCALE * (y);
  38.    if (i!=0) {
  39.       ax = xsection[i][0] - xsection[i-1][0];
  40.       ay = xsection[i][1] - xsection[i-1][1];
  41.       alen = 1.0 / sqrt (ax*ax + ay*ay);
  42.       ax *= alen;   ay *= alen;
  43.       xnormal [i-1][0] = - ay;
  44.       xnormal [i-1][1] = ax;
  45.    }
  46.    i++;
  47. }
  48. #define NUM_XSECTION_PTS (12)
  49. double xsection [NUM_XSECTION_PTS][2];
  50. double xnormal [NUM_XSECTION_PTS][2];
  51. /* =========================================================== */
  52. void InitStuff (void)
  53. {
  54.    int i;
  55.    i=0;
  56.    while (i<22) {
  57.       TXZERO ();
  58.       TPTS (-1.1 +((float) i)/10.0, 0.0, 0.0);
  59.    }
  60.    i=0;
  61.    XSECTION (-6.0, 6.0);
  62.    XSECTION (6.0, 6.0);
  63.    XSECTION (6.0, 5.0);
  64.    XSECTION (1.0, 5.0);
  65.    XSECTION (1.0, -5.0);
  66.    XSECTION (6.0, -5.0);
  67.    XSECTION (6.0, -6.0);
  68.    XSECTION (-6.0, -6.0);
  69.    XSECTION (-6.0, -5.0);
  70.    XSECTION (-1.0, -5.0);
  71.    XSECTION (-1.0, 5.0);
  72.    XSECTION (-6.0, 5.0);
  73. }
  74. void TwistBeam (double howmuch) {
  75.    int i;
  76.    double z;
  77.    for (i=0; i<22; i++) {
  78.       z = ((double) (i-14)) / 10.0;
  79.       beam_twists[i] = howmuch * exp (-3.0 * z*z);
  80.    }
  81. }
  82. /* =========================================================== */
  83. extern float lastx;
  84. void DrawStuff (void) {
  85.    TwistBeam ((double) (lastx -121) / 8.0);
  86.    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  87.    /* set up some matrices so that the object spins with the mouse */
  88.    glPushMatrix ();
  89.    glTranslatef (0.0, 0.0, -80.0);
  90.    glRotated (43.0, 1.0, 0.0, 0.0);
  91.    glRotated (43.0, 0.0, 1.0, 0.0);
  92.    glScaled (1.8, 1.8, 1.8);
  93.    gleTwistExtrusion (NUM_XSECTION_PTS, xsection, xnormal, 
  94.               NULL, NUM_BEAM_PTS, beam_spine, NULL, beam_twists);
  95.    glPopMatrix ();
  96.    glutSwapBuffers ();
  97. }
  98. /* ------------------ end of file -------------------- */