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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994. */
  2. /* This program is freely distributable without licensing fees 
  3.    and is provided without guarantee or warrantee expressed or 
  4.    implied. This program is -not- in the public domain. */
  5. /* Don't take this program too seriously.  It is just a hack. */
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <ctype.h>
  9. #include <math.h>
  10. #include <GL/glut.h>
  11. GLfloat light_diffuse[] =
  12. {1.0, 0.0, 0.0, 1.0};
  13. GLfloat light_position[] =
  14. {1.0, 1.0, 1.0, 0.0};
  15. GLUquadricObj *qobj;
  16. int win1, win2, submenu1, submenu2;
  17. int list = 1;
  18. float thetime = 0.0;
  19. void
  20. display(void)
  21. {
  22.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  23.   if (glutGetWindow() == win1) {
  24.     glCallList(list);   /* render sphere display list */
  25.   } else {
  26.     glCallList(1);      /* render sphere display list */
  27.   }
  28.   glutSwapBuffers();
  29. }
  30. void
  31. display_win1(void)
  32. {
  33.   glPushMatrix();
  34.   glTranslatef(0.0, 0.0, -1 - 2 * sin(thetime));
  35.   display();
  36.   glPopMatrix();
  37. }
  38. void
  39. idle(void)
  40. {
  41.   GLfloat light_position[] =
  42.   {1.0, 1.0, 1.0, 0.0};
  43.   glutSetWindow(win1);
  44.   thetime += 0.05;
  45.   light_position[1] = 1 + sin(thetime);
  46.   glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  47.   display_win1();
  48. }
  49. /* ARGSUSED */
  50. void
  51. delayed_stop(int value)
  52. {
  53.   glutIdleFunc(NULL);
  54. }
  55. void
  56. it(int value)
  57. {
  58.   glutDestroyWindow(glutGetWindow());
  59.   printf("menu selection: win=%d, menu=%dn", glutGetWindow(), glutGetMenu());
  60.   switch (value) {
  61.   case 1:
  62.     if (list == 1) {
  63.       list = 2;
  64.     } else {
  65.       list = 1;
  66.     }
  67.     break;
  68.   case 2:
  69.     exit(0);
  70.     break;
  71.   case 3:
  72.     glutAddMenuEntry("new entry", value + 9);
  73.     break;
  74.   case 4:
  75.     glutChangeToMenuEntry(1, "toggle it for drawing", 1);
  76.     glutChangeToMenuEntry(3, "motion done", 3);
  77.     glutIdleFunc(idle);
  78.     break;
  79.   case 5:
  80.     glutIdleFunc(NULL);
  81.     break;
  82.   case 6:
  83.     glutTimerFunc(2000, delayed_stop, 0);
  84.     break;
  85.   default:
  86.     printf("value = %dn", value);
  87.   }
  88. }
  89. void
  90. init(void)
  91. {
  92.   gluQuadricDrawStyle(qobj, GLU_FILL);
  93.   glNewList(1, GL_COMPILE);  /* create sphere display list */
  94.   gluSphere(qobj, /* radius */ 1.0, /* slices */ 20,  /* stacks 
  95.                                                        */ 20);
  96.   glEndList();
  97.   gluQuadricDrawStyle(qobj, GLU_LINE);
  98.   glNewList(2, GL_COMPILE);  /* create sphere display list */
  99.   gluSphere(qobj, /* radius */ 1.0, /* slices */ 20,  /* stacks 
  100.                                                        */ 20);
  101.   glEndList();
  102.   glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  103.   glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  104.   glEnable(GL_LIGHTING);
  105.   glEnable(GL_LIGHT0);
  106.   glEnable(GL_DEPTH_TEST);
  107.   glMatrixMode(GL_PROJECTION);
  108.   gluPerspective( /* field of view in degree */ 40.0,
  109.   /* aspect ratio */ 1.0,
  110.     /* Z near */ 1.0, /* Z far */ 10.0);
  111.   glMatrixMode(GL_MODELVIEW);
  112.   gluLookAt(0.0, 0.0, 5.0,  /* eye is at (0,0,5) */
  113.     0.0, 0.0, 0.0,      /* center is at (0,0,0) */
  114.     0.0, 1.0, 0.);      /* up is in positive Y direction */
  115.   glTranslatef(0.0, 0.0, -1.0);
  116. }
  117. void
  118. menustate(int inuse)
  119. {
  120.   printf("menu is %sn", inuse ? "INUSE" : "not in use");
  121.   if (!inuse) {
  122.   }
  123. }
  124. void
  125. keyboard(unsigned char key, int x, int y)
  126. {
  127.   if (isprint(key)) {
  128.     printf("key: `%c' %d,%dn", key, x, y);
  129.   } else {
  130.     printf("key: 0x%x %d,%dn", key, x, y);
  131.   }
  132. }
  133. void
  134. special(int key, int x, int y)
  135. {
  136.   char *name;
  137.   switch (key) {
  138.   case GLUT_KEY_F1:
  139.     name = "F1";
  140.     break;
  141.   case GLUT_KEY_F2:
  142.     name = "F2";
  143.     break;
  144.   case GLUT_KEY_F3:
  145.     name = "F3";
  146.     break;
  147.   case GLUT_KEY_F4:
  148.     name = "F4";
  149.     break;
  150.   case GLUT_KEY_F5:
  151.     name = "F5";
  152.     break;
  153.   case GLUT_KEY_F6:
  154.     name = "F6";
  155.     break;
  156.   case GLUT_KEY_F7:
  157.     name = "F7";
  158.     break;
  159.   case GLUT_KEY_F8:
  160.     name = "F8";
  161.     break;
  162.   case GLUT_KEY_F9:
  163.     name = "F9";
  164.     break;
  165.   case GLUT_KEY_F10:
  166.     name = "F11";
  167.     break;
  168.   case GLUT_KEY_F11:
  169.     name = "F12";
  170.     break;
  171.   case GLUT_KEY_LEFT:
  172.     name = "Left";
  173.     break;
  174.   case GLUT_KEY_UP:
  175.     name = "Up";
  176.     break;
  177.   case GLUT_KEY_RIGHT:
  178.     name = "Right";
  179.     break;
  180.   case GLUT_KEY_DOWN:
  181.     name = "Down";
  182.     break;
  183.   case GLUT_KEY_PAGE_UP:
  184.     name = "Page up";
  185.     break;
  186.   case GLUT_KEY_PAGE_DOWN:
  187.     name = "Page down";
  188.     break;
  189.   case GLUT_KEY_HOME:
  190.     name = "Home";
  191.     break;
  192.   case GLUT_KEY_END:
  193.     name = "End";
  194.     break;
  195.   case GLUT_KEY_INSERT:
  196.     name = "Insert";
  197.     break;
  198.   default:
  199.     name = "UNKONW";
  200.     break;
  201.   }
  202.   printf("special: %s %d,%dn", name, x, y);
  203. }
  204. void
  205. mouse(int button, int state, int x, int y)
  206. {
  207.   printf("button: %d %s %d,%dn", button, state == GLUT_UP ? "UP" : "down", x, y);
  208. }
  209. void
  210. motion(int x, int y)
  211. {
  212.   printf("motion: %d,%dn", x, y);
  213. }
  214. void
  215. visible(int status)
  216. {
  217.   printf("visible: %sn", status == GLUT_VISIBLE ? "YES" : "no");
  218. }
  219. void
  220. enter_leave(int state)
  221. {
  222.   printf("enter/leave %d = %sn",
  223.     glutGetWindow(),
  224.     state == GLUT_LEFT ? "left" : "entered");
  225. }
  226. int
  227. main(int argc, char **argv)
  228. {
  229.   qobj = gluNewQuadric();
  230.   glutInit(&argc, argv);
  231.   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  232.   win1 = glutCreateWindow("sphere");
  233.   glutEntryFunc(enter_leave);
  234.   init();
  235.   glutDisplayFunc(display_win1);
  236.   glutCreateMenu(it);
  237.   glutAddMenuEntry("toggle draw mode", 1);
  238.   glutAddMenuEntry("exit", 2);
  239.   glutAddMenuEntry("new menu entry", 3);
  240.   glutAddMenuEntry("motion", 4);
  241.   glutAttachMenu(GLUT_LEFT_BUTTON);
  242.   glutCreateMenu(it);
  243.   glutAddMenuEntry("yes", 1);
  244.   glutAddMenuEntry("no", 2);
  245.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  246.   win2 = glutCreateWindow("second window");
  247.   glutEntryFunc(enter_leave);
  248.   glutKeyboardFunc(keyboard);
  249.   glutSpecialFunc(special);
  250.   glutMouseFunc(mouse);
  251. #if 0
  252.   glutMotionFunc(motion);
  253. #endif
  254.   glutVisibilityFunc(visible);
  255.   init();
  256.   light_diffuse[1] = 1;
  257.   light_diffuse[2] = 1;
  258.   glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  259.   glutDisplayFunc(display);
  260.   submenu1 = glutCreateMenu(it);
  261.   glutAddMenuEntry("submenu a", 666);
  262.   glutAddMenuEntry("submenu b", 777);
  263.   submenu2 = glutCreateMenu(it);
  264.   glutAddMenuEntry("submenu 1", 25);
  265.   glutAddMenuEntry("submenu 2", 26);
  266.   glutAddSubMenu("submenuXXX", submenu1);
  267.   glutCreateMenu(it);
  268.   glutAddSubMenu("submenu", submenu2);
  269.   glutAddMenuEntry("stop motion", 5);
  270.   glutAddMenuEntry("delayed stop motion", 6);
  271.   glutAddSubMenu("submenu", submenu2);
  272.   glutAttachMenu(GLUT_LEFT_BUTTON);
  273.   glutMenuStateFunc(menustate);
  274.   glutMainLoop();
  275.   return 0;             /* ANSI C requires main to return int. */
  276. }