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

GIS编程

开发平台:

Visual C++

  1. /* XXX Very crufty code follows. */
  2. #include <stdlib.h>
  3. #include <GL/glut.h>
  4. #include <math.h>
  5. #ifndef _WIN32
  6. #include <unistd.h>
  7. #else
  8. #define random rand
  9. #define srandom srand
  10. #include <process.h>
  11. #endif
  12. /* Some <math.h> files do not define M_PI... */
  13. #ifndef M_PI
  14. #define M_PI 3.14159265358979323846
  15. #endif
  16. #include <sys/types.h>
  17. #include <stdio.h>
  18. /* For portability... */
  19. #undef fcos
  20. #undef fsin
  21. #define fcos  cos
  22. #define fsin  sin
  23. /* --- shape parameters def'n --- */
  24. #define N_SHAPES 7
  25. float pos[N_SHAPES * 3];
  26. float dir[N_SHAPES * 3];
  27. float acc[N_SHAPES * 3];
  28. float col[N_SHAPES * 3];
  29. float hsv[N_SHAPES * 3];
  30. float hpr[N_SHAPES * 3];
  31. float ang[N_SHAPES];
  32. float spn[N_SHAPES];
  33. float sca[N_SHAPES];
  34. float geep[N_SHAPES];
  35. float peep[N_SHAPES];
  36. float speedsq[N_SHAPES];
  37. int blad[N_SHAPES];
  38. float ht, wd;
  39. void
  40. initshapes(int i)
  41. {
  42.   int k;
  43.   float f;
  44.   /* random init of pos, dir, color */
  45.   for (k = i * 3; k <= i * 3 + 2; k++) {
  46.     f = random() / (float)RAND_MAX;
  47.     pos[k] = f;
  48.     f = random() / (float)RAND_MAX;
  49.     f = (f - 0.5) * 0.05;
  50.     dir[k] = f;
  51.     f = random() / (float)RAND_MAX;
  52.     f = (f - 0.5) * 0.0002;
  53.     acc[k] = f;
  54.     f = random() / (float)RAND_MAX;
  55.     col[k] = f;
  56.   }
  57.   speedsq[i] = dir[i * 3] * dir[i * 3] + dir[i * 3 + 1] * dir[i * 3 + 1];
  58.   f = random() / (float)RAND_MAX;
  59.   blad[i] = 2 + (int) (f * 17.0);
  60.   f = random() / (float)RAND_MAX;
  61.   ang[i] = f;
  62.   f = random() / (float)RAND_MAX;
  63.   spn[i] = (f - 0.5) * 40.0 / (10 + blad[i]);
  64.   f = random() / (float)RAND_MAX;
  65.   sca[i] = (f * 0.1 + 0.08);
  66.   dir[i * 3] *= sca[i];
  67.   dir[i * 3 + 1] *= sca[i];
  68.   f = random() / (float)RAND_MAX;
  69.   hsv[i * 3] = f * 360.0;
  70.   f = random() / (float)RAND_MAX;
  71.   hsv[i * 3 + 1] = f * 0.6 + 0.4;
  72.   f = random() / (float)RAND_MAX;
  73.   hsv[i * 3 + 2] = f * 0.7 + 0.3;
  74.   f = random() / (float)RAND_MAX;
  75.   hpr[i * 3] = f * 0.005 * 360.0;
  76.   f = random() / (float)RAND_MAX;
  77.   hpr[i * 3 + 1] = f * 0.03;
  78.   f = random() / (float)RAND_MAX;
  79.   hpr[i * 3 + 2] = f * 0.02;
  80.   geep[i] = 0;
  81.   f = random() / (float)RAND_MAX;
  82.   peep[i] = 0.01 + f * 0.2;
  83. }
  84. int tko = 0;
  85. float bladeratio[] =
  86. {
  87.   /* nblades = 2..7 */
  88.   0.0, 0.0, 3.00000, 1.73205, 1.00000, 0.72654, 0.57735, 0.48157,
  89.   /* 8..13 */
  90.   0.41421, 0.36397, 0.19076, 0.29363, 0.26795, 0.24648,
  91.   /* 14..19 */
  92.   0.22824, 0.21256, 0.19891, 0.18693, 0.17633, 0.16687,
  93. };
  94. void
  95. drawleaf(int l)
  96. {
  97.   int b, blades;
  98.   float x, y;
  99.   float wobble;
  100.   blades = blad[l];
  101.   y = 0.10 * fsin(geep[l] * M_PI / 180.0) + 0.099 * fsin(geep[l] * 5.12 * M_PI / 180.0);
  102.   if (y < 0)
  103.     y = -y;
  104.   x = 0.15 * fcos(geep[l] * M_PI / 180.0) + 0.149 * fcos(geep[l] * 5.12 * M_PI / 180.0);
  105.   if (x < 0.0)
  106.     x = 0.0 - x;
  107.   if (y < 0.001 && x > 0.000002 && ((tko & 0x1) == 0)) {
  108.     initshapes(l);      /* let it become reborn as something
  109.                            else */
  110.     tko++;
  111.     return;
  112.   } {
  113.     float w1 = fsin(geep[l] * 15.3 * M_PI / 180.0);
  114.     wobble = 3.0 + 2.00 * fsin(geep[l] * 0.4 * M_PI / 180.0) + 3.94261 * w1;
  115.   }
  116.   /**
  117.   if(blades == 2) if (y > 3.000*x) y = x*3.000;
  118.   if(blades == 3) if (y > 1.732*x) y = x*1.732;
  119.   if(blades == 4) if (y >       x) y = x;
  120.   if(blades == 5) if (y > 0.726*x) y = x*0.726;
  121.   if(blades == 6) if (y > 0.577*x) y = x*0.577;
  122.   if(blades == 7) if (y > 0.481*x) y = x*0.481;
  123.   if(blades == 8) if (y > 0.414*x) y = x*0.414;
  124.   */
  125.   if (y > x * bladeratio[blades])
  126.     y = x * bladeratio[blades];
  127.   for (b = 0; b < blades; b++) {
  128.     glPushMatrix();
  129.     glTranslatef(pos[l * 3], pos[l * 3 + 1], pos[l * 3 + 2]);
  130.     glRotatef(ang[l] + b * (360.0 / blades), 0.0, 0.0, 1.0);
  131.     glScalef(wobble * sca[l], wobble * sca[l], wobble * sca[l]);
  132.     /**
  133.     if(tko & 0x40000) glColor3f(col[l*3], col[l*3+1], col[l*3+2]); 
  134.     else
  135.     */
  136.     glColor4ub(0, 0, 0, 0x60);
  137.     /* constrain geep cooridinates here XXX */
  138.     glEnable(GL_BLEND);
  139.     glBegin(GL_TRIANGLE_STRIP);
  140.     glVertex2f(x * sca[l], 0.0);
  141.     glVertex2f(x, y);
  142.     glVertex2f(x, -y);  /* C */
  143.     glVertex2f(0.3, 0.0);  /* D */
  144.     glEnd();
  145.     /**
  146.     if(tko++ & 0x40000) glColor3f(0,0,0);
  147.     else
  148.     */
  149.     glColor3f(col[l * 3], col[l * 3 + 1], col[l * 3 + 2]);
  150.     glBegin(GL_LINE_LOOP);
  151.     glVertex2f(x * sca[l], 0.0);
  152.     glVertex2f(x, y);
  153.     glVertex2f(0.3, 0.0);  /* D */
  154.     glVertex2f(x, -y);  /* C */
  155.     glEnd();
  156.     glDisable(GL_BLEND);
  157.     glPopMatrix();
  158.   }
  159. }
  160. void
  161. motionUpdate(int t)
  162. {
  163.   if (pos[t * 3] < -sca[t] * wd && dir[t * 3] < 0.0) {
  164.     dir[t * 3] = -dir[t * 3];
  165.   /**
  166.   acc[t*3+1] += 0.8*acc[t*3];
  167.   acc[t*3] = -0.8*acc[t*3];
  168.   */
  169.   } else if (pos[t * 3] > (1 + sca[t]) * wd && dir[t * 3] > 0.0) {
  170.     dir[t * 3] = -dir[t * 3];
  171.     /**
  172.     acc[t*3+1] += 0.8*acc[t*3];
  173.     acc[t*3] = -0.8*acc[t*3];
  174.     */
  175.   } else if (pos[t * 3 + 1] < -sca[t] * ht && dir[t * 3 + 1] < 0.0) {
  176.     dir[t * 3 + 1] = -dir[t * 3 + 1];
  177.     /**
  178.     acc[t*3] += 0.8*acc[t*3+1];
  179.     acc[t*3+1] = -0.8*acc[t*3+1];
  180.     */
  181.   } else if (pos[t * 3 + 1] > (1 + sca[t]) * ht && dir[t * 3 + 1] > 0.0) {
  182.     dir[t * 3 + 1] = -dir[t * 3 + 1];
  183.     /**
  184.     acc[t*3] += 0.8*acc[t*3+1];
  185.     acc[t*3+1] = -0.8*acc[t*3+1];
  186.     */
  187.   }
  188.   pos[t * 3] += dir[t * 3];
  189.   pos[t * 3 + 1] += dir[t * 3 + 1];
  190.   /**
  191.   dir[t*3]   += acc[t*3];
  192.   dir[t*3+1] += acc[t*3+1];
  193.   */
  194.   ang[t] += spn[t];
  195.   geep[t] += peep[t];
  196.   if (geep[t] > 360 * 5.0)
  197.     geep[t] -= 360 * 5.0;
  198.   if (ang[t] < 0.0) {
  199.     ang[t] += 360.0;
  200.   }
  201.   if (ang[t] > 360.0) {
  202.     ang[t] -= 360.0;
  203.   }
  204. }
  205. void
  206. colorUpdate(int i)
  207. {
  208.   if (hsv[i * 3 + 1] <= 0.5 && hpr[i * 3 + 1] < 0.0)
  209.     hpr[i * 3 + 1] = -hpr[i * 3 + 1];  /* adjust s */
  210.   if (hsv[i * 3 + 1] >= 1.0 && hpr[i * 3 + 1] > 0.0)
  211.     hpr[i * 3 + 1] = -hpr[i * 3 + 1];  /* adjust s */
  212.   if (hsv[i * 3 + 2] <= 0.4 && hpr[i * 3 + 2] < 0.0)
  213.     hpr[i * 3 + 2] = -hpr[i * 3 + 2];  /* adjust s */
  214.   if (hsv[i * 3 + 2] >= 1.0 && hpr[i * 3 + 2] > 0.0)
  215.     hpr[i * 3 + 2] = -hpr[i * 3 + 2];  /* adjust s */
  216.   hsv[i * 3] += hpr[i * 3];
  217.   hsv[i * 3 + 1] += hpr[i * 3 + 1];
  218.   hsv[i * 3 + 2] += hpr[i * 3 + 2];
  219.   /* --- hsv -> rgb --- */
  220. #define H(hhh) hhh[i*3  ]
  221. #define S(hhh) hhh[i*3+1]
  222. #define V(hhh) hhh[i*3+2]
  223. #define R(hhh) hhh[i*3  ]
  224. #define G(hhh) hhh[i*3+1]
  225. #define B(hhh) hhh[i*3+2]
  226.   if (V(hsv) < 0.0)
  227.     V(hsv) = 0.0;
  228.   if (V(hsv) > 1.0)
  229.     V(hsv) = 1.0;
  230.   if (S(hsv) <= 0.0) {
  231.     R(col) = V(hsv);
  232.     G(col) = V(hsv);
  233.     B(col) = V(hsv);
  234.   } else {
  235.     float f, h, p, q, t, v;
  236.     int hi;
  237.     while (H(hsv) < 0.0)
  238.       H(hsv) += 360.0;
  239.     while (H(hsv) >= 360.0)
  240.       H(hsv) -= 360.0;
  241.     if (S(hsv) < 0.0)
  242.       S(hsv) = 0.0;
  243.     if (S(hsv) > 1.0)
  244.       S(hsv) = 1.0;
  245.     h = H(hsv) / 60.0;
  246.     hi = (int) (h);
  247.     f = h - hi;
  248.     v = V(hsv);
  249.     p = V(hsv) * (1 - S(hsv));
  250.     q = V(hsv) * (1 - S(hsv) * f);
  251.     t = V(hsv) * (1 - S(hsv) * (1 - f));
  252.     if (hi <= 0) {
  253.       R(col) = v;
  254.       G(col) = t;
  255.       B(col) = p;
  256.     } else if (hi == 1) {
  257.       R(col) = q;
  258.       G(col) = v;
  259.       B(col) = p;
  260.     } else if (hi == 2) {
  261.       R(col) = p;
  262.       G(col) = v;
  263.       B(col) = t;
  264.     } else if (hi == 3) {
  265.       R(col) = p;
  266.       G(col) = q;
  267.       B(col) = v;
  268.     } else if (hi == 4) {
  269.       R(col) = t;
  270.       G(col) = p;
  271.       B(col) = v;
  272.     } else {
  273.       R(col) = v;
  274.       G(col) = p;
  275.       B(col) = q;
  276.     }
  277.   }
  278. }
  279. void
  280. gravity(float fx)
  281. {
  282.   int a, b;
  283.   for (a = 0; a < N_SHAPES; a++) {
  284.     for (b = 0; b < a; b++) {
  285.       float t, d2;
  286.       t = pos[b * 3] - pos[a * 3];
  287.       d2 = t * t;
  288.       t = pos[b * 3 + 1] - pos[a * 3 + 1];
  289.       d2 += t * t;
  290.       if (d2 < 0.000001)
  291.         d2 = 0.00001;
  292.       if (d2 < 0.1) {
  293.         float v0, v1, z;
  294.         v0 = pos[b * 3] - pos[a * 3];
  295.         v1 = pos[b * 3 + 1] - pos[a * 3 + 1];
  296.         z = 0.00000001 * fx / (d2);
  297.         dir[a * 3] += v0 * z * sca[b];
  298.         dir[b * 3] += -v0 * z * sca[a];
  299.         dir[a * 3 + 1] += v1 * z * sca[b];
  300.         dir[b * 3 + 1] += -v1 * z * sca[a];
  301.       }
  302.     }
  303.     /** apply brakes
  304.     if(dir[a*3]*dir[a*3] + dir[a*3+1]*dir[a*3+1]
  305.       > 0.0001) {
  306.       dir[a*3] *= 0.9;
  307.       dir[a*3+1] *= 0.9;
  308.     }
  309.     */
  310.   }
  311. }
  312. void
  313. oneFrame(void)
  314. {
  315.   int i;
  316.   /**
  317.   if((random() & 0xff) == 0x34){
  318.     glClear(GL_COLOR_BUFFER_BIT);
  319.   }
  320.   if((tko & 0x1f) == 0x1f){
  321.     glEnable(GL_BLEND);
  322.     glColor4f(0.0, 0.0, 0.0, 0.09);
  323.     glRectf(0.0, 0.0, wd, ht);
  324.     glDisable(GL_BLEND);
  325. #ifdef __sgi
  326.     sginap(0);
  327. #endif
  328.   }
  329.   */
  330.   gravity(-2.0);
  331.   for (i = 0; i < N_SHAPES; i++) {
  332.     motionUpdate(i);
  333. #ifdef __sgi
  334.     sginap(0);
  335. #endif
  336.     colorUpdate(i);
  337. #ifdef __sgi
  338.     sginap(0);
  339. #endif
  340.     drawleaf(i);
  341. #ifdef __sgi
  342.     sginap(0);
  343. #endif
  344.   }
  345.   glFlush();
  346. }
  347. void
  348. display(void)
  349. {
  350.   glClear(GL_COLOR_BUFFER_BIT);
  351. }
  352. void
  353. myReshape(int w, int h)
  354. {
  355.   glViewport(0, 0, w, h);
  356.   glMatrixMode(GL_PROJECTION);
  357.   glLoadIdentity();
  358.   if (w <= h) {
  359.     wd = 1.0;
  360.     ht = (GLfloat) h / (GLfloat) w;
  361.     glOrtho(0.0, 1.0,
  362.       0.0, 1.0 * (GLfloat) h / (GLfloat) w,
  363.       -16.0, 4.0);
  364.   } else {
  365.     wd = (GLfloat) w / (GLfloat) h;
  366.     ht = 1.0;
  367.     glOrtho(0.0, 1.0 * (GLfloat) w / (GLfloat) h,
  368.       0.0, 1.0,
  369.       -16.0, 4.0);
  370.   }
  371.   glMatrixMode(GL_MODELVIEW);
  372.   glLoadIdentity();
  373. }
  374. void
  375. visibility(int status)
  376. {
  377.   if (status == GLUT_VISIBLE) {
  378.     glutIdleFunc(oneFrame);
  379.   } else {
  380.     glutIdleFunc(NULL);
  381.   }
  382. }
  383. void
  384. myinit(void)
  385. {
  386.   int i;
  387.   srandom(getpid());
  388.   glClearColor(0.0, 0.0, 0.0, 1.0);
  389.   glEnable(GL_LINE_SMOOTH);
  390.   glShadeModel(GL_FLAT);
  391.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  392.   for (i = 0; i < N_SHAPES; i++)
  393.     initshapes(i);
  394.   myReshape(200, 200);
  395. }
  396. /* ARGSUSED1 */
  397. void
  398. keys(unsigned char c, int x, int y)
  399. {
  400.   if (c == 0x1b)
  401.     exit(0);            /* escape */
  402. }
  403. int
  404. main(int argc, char **argv)
  405. {
  406.   glutInit(&argc, argv);
  407.   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  408.   glutInitWindowSize(300, 300);
  409.   glutCreateWindow(argv[0]);
  410.   myinit();
  411.   glutReshapeFunc(myReshape);
  412.   glutDisplayFunc(display);
  413.   glutKeyboardFunc(keys);
  414.   glutVisibilityFunc(visibility);
  415.   glutIdleFunc(oneFrame);
  416.   glutPostRedisplay();
  417.   glutMainLoop();
  418.   return 0;             /* ANSI C requires main to return int. */
  419. }