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

GIS编程

开发平台:

Visual C++

  1. /* bounce.c */
  2. /*
  3.  * Bouncing ball demo.
  4.  *
  5.  * This program is in the public domain
  6.  *
  7.  * Brian Paul
  8.  */
  9. /* Conversion to GLUT by Mark J. Kilgard */
  10. #include <math.h>
  11. #include <stdlib.h>
  12. #include <GL/glut.h>
  13. #define COS(X)   cos( (X) * 3.14159/180.0 )
  14. #define SIN(X)   sin( (X) * 3.14159/180.0 )
  15. #define RED 1
  16. #define WHITE 2
  17. #define CYAN 3
  18. GLuint Ball;
  19. GLenum Mode;
  20. GLfloat Zrot = 0.0, Zstep = 6.0;
  21. GLfloat Xpos = 0.0, Ypos = 1.0;
  22. GLfloat Xvel = 0.2, Yvel = 0.0;
  23. GLfloat Xmin = -4.0, Xmax = 4.0;
  24. GLfloat Ymin = -3.8, Ymax = 4.0;
  25. GLfloat G = -0.1;
  26. static GLuint 
  27. make_ball(void)
  28. {
  29.   GLuint list;
  30.   GLfloat a, b;
  31.   GLfloat da = 18.0, db = 18.0;
  32.   GLfloat radius = 1.0;
  33.   GLuint color;
  34.   GLfloat x, y, z;
  35.   list = glGenLists(1);
  36.   glNewList(list, GL_COMPILE);
  37.   color = 0;
  38.   for (a = -90.0; a + da <= 90.0; a += da) {
  39.     glBegin(GL_QUAD_STRIP);
  40.     for (b = 0.0; b <= 360.0; b += db) {
  41.       if (color) {
  42. glIndexi(RED);
  43.       } else {
  44. glIndexi(WHITE);
  45.       }
  46.       x = COS(b) * COS(a);
  47.       y = SIN(b) * COS(a);
  48.       z = SIN(a);
  49.       glVertex3f(x, y, z);
  50.       x = radius * COS(b) * COS(a + da);
  51.       y = radius * SIN(b) * COS(a + da);
  52.       z = radius * SIN(a + da);
  53.       glVertex3f(x, y, z);
  54.       color = 1 - color;
  55.     }
  56.     glEnd();
  57.   }
  58.   glEndList();
  59.   return list;
  60. }
  61. static void 
  62. reshape(int width, int height)
  63. {
  64.   glViewport(0, 0, (GLint) width, (GLint) height);
  65.   glMatrixMode(GL_PROJECTION);
  66.   glLoadIdentity();
  67.   glOrtho(-6.0, 6.0, -6.0, 6.0, -6.0, 6.0);
  68.   glMatrixMode(GL_MODELVIEW);
  69. }
  70. /* ARGSUSED1 */
  71. static void
  72. key(unsigned char k, int x, int y)
  73. {
  74.   switch (k) {
  75.   case 27:  /* Escape */
  76.     exit(0);
  77.   }
  78. }
  79. static void 
  80. draw(void)
  81. {
  82.   GLint i;
  83.   glClear(GL_COLOR_BUFFER_BIT);
  84.   glIndexi(CYAN);
  85.   glBegin(GL_LINES);
  86.   for (i = -5; i <= 5; i++) {
  87.     glVertex2i(i, -5);
  88.     glVertex2i(i, 5);
  89.   }
  90.   for (i = -5; i <= 5; i++) {
  91.     glVertex2i(-5, i);
  92.     glVertex2i(5, i);
  93.   }
  94.   for (i = -5; i <= 5; i++) {
  95.     glVertex2i(i, -5);
  96.     glVertex2f(i * 1.15, -5.9);
  97.   }
  98.   glVertex2f(-5.3, -5.35);
  99.   glVertex2f(5.3, -5.35);
  100.   glVertex2f(-5.75, -5.9);
  101.   glVertex2f(5.75, -5.9);
  102.   glEnd();
  103.   glPushMatrix();
  104.   glTranslatef(Xpos, Ypos, 0.0);
  105.   glScalef(2.0, 2.0, 2.0);
  106.   glRotatef(8.0, 0.0, 0.0, 1.0);
  107.   glRotatef(90.0, 1.0, 0.0, 0.0);
  108.   glRotatef(Zrot, 0.0, 0.0, 1.0);
  109.   glCallList(Ball);
  110.   glPopMatrix();
  111.   glFlush();
  112.   glutSwapBuffers();
  113. }
  114. static void 
  115. idle(void)
  116. {
  117.   static float vel0 = -100.0;
  118.   Zrot += Zstep;
  119.   Xpos += Xvel;
  120.   if (Xpos >= Xmax) {
  121.     Xpos = Xmax;
  122.     Xvel = -Xvel;
  123.     Zstep = -Zstep;
  124.   }
  125.   if (Xpos <= Xmin) {
  126.     Xpos = Xmin;
  127.     Xvel = -Xvel;
  128.     Zstep = -Zstep;
  129.   }
  130.   Ypos += Yvel;
  131.   Yvel += G;
  132.   if (Ypos < Ymin) {
  133.     Ypos = Ymin;
  134.     if (vel0 == -100.0)
  135.       vel0 = fabs(Yvel);
  136.     Yvel = vel0;
  137.   }
  138.   glutPostRedisplay();
  139. }
  140. void 
  141. visible(int vis)
  142. {
  143.   if (vis == GLUT_VISIBLE)
  144.     glutIdleFunc(idle);
  145.   else
  146.     glutIdleFunc(NULL);
  147. }
  148. int
  149. main(int argc, char *argv[])
  150. {
  151.   glutInit(&argc, argv);
  152.   glutInitDisplayMode(GLUT_INDEX | GLUT_DOUBLE);
  153.   glutCreateWindow("Bounce");
  154.   Ball = make_ball();
  155.   glCullFace(GL_BACK);
  156.   glEnable(GL_CULL_FACE);
  157.   glDisable(GL_DITHER);
  158.   glShadeModel(GL_FLAT);
  159.   glutDisplayFunc(draw);
  160.   glutReshapeFunc(reshape);
  161.   glutVisibilityFunc(visible);
  162.   glutKeyboardFunc(key);
  163.   glutSetColor(RED, 1.0, 0.0, 0.0);
  164.   glutSetColor(WHITE, 1.0, 1.0, 1.0);
  165.   glutSetColor(CYAN, 0.0, 1.0, 1.0);
  166.   glutMainLoop();
  167.   return 0;             /* ANSI C requires main to return int. */
  168. }