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

GIS编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <GL/glut.h>
  4. #define CHECK_ERROR(str)                                           
  5. {                                                                  
  6.     GLenum error;                                                  
  7.     if(error = glGetError())                                       
  8.        printf("GL Error: %s (%s)n", gluErrorString(error), str);  
  9. }
  10. int winWidth = 512;
  11. int winHeight = 512;
  12. GLboolean smooth = GL_FALSE;
  13. GLboolean dblbuf = GL_TRUE;
  14. GLfloat objangle[2] = {0.f, 0.f};
  15. GLfloat scale = 1.f;
  16. int active;
  17. enum {X, Y, Z};
  18. enum {OBJ_ANGLE, OBJ_SCALE};
  19. enum {NOLIST, PLANE}; /* display lists */
  20. /* load data structure from file */
  21. enum {VERTS, END};
  22. void
  23. reshape(int wid, int ht)
  24. {
  25.     winWidth = wid;
  26.     winHeight = ht;
  27.     glViewport(0, 0, wid, ht);
  28. }
  29. void
  30. motion(int x, int y)
  31. {
  32.     switch(active)
  33.     {
  34.     case OBJ_ANGLE:
  35. objangle[X] = (x - winWidth/2) * 360./winWidth;
  36. objangle[Y] = (y - winHeight/2) * 360./winHeight;
  37. glutPostRedisplay();
  38. break;
  39.     case OBJ_SCALE:
  40. scale = x * 5./winWidth;
  41. objangle[Y] = (y - winHeight/2) * 360./winHeight;
  42. glutPostRedisplay();
  43. break;
  44.     }
  45. }
  46. void
  47. mouse(int button, int state, int x, int y)
  48. {
  49.     if(state == GLUT_DOWN)
  50. switch(button)
  51. {
  52. case GLUT_LEFT_BUTTON: /* rotate the object */
  53.     active = OBJ_ANGLE;
  54.     motion(x, y);
  55.     break;
  56. case GLUT_RIGHT_BUTTON: /* scale the object */
  57.     active = OBJ_SCALE;
  58.     motion(x, y);
  59.     break;
  60. }
  61. }
  62. /* ARGSUSED1 */
  63. void key(unsigned char key, int x, int y)
  64. {
  65.     switch(key)
  66.     {
  67.     case 's': /* toggle line smoothing */
  68. if(smooth)
  69. {
  70.     glDisable(GL_LINE_SMOOTH);
  71.     glDisable(GL_BLEND);
  72.     smooth = GL_FALSE;
  73.     printf("Turn off OpenGL line smoothingn");
  74. }
  75. else
  76. {
  77.     glEnable(GL_LINE_SMOOTH);
  78.     glEnable(GL_BLEND);
  79.     printf("Turn on OpenGL line smoothingn");
  80.     smooth = GL_TRUE;
  81. }
  82. glutPostRedisplay();
  83. break;
  84.     case '33':
  85. exit(0);
  86. break;
  87.    case '?':
  88.    case 'h':
  89.    case 'H':
  90.     default:
  91. fprintf(stderr, "Keyboard commands:nn"
  92. "s - toggle smooth line moden");
  93. break;
  94.     }
  95. }
  96. void
  97. loader(char *fname)
  98. {
  99.     FILE *fp;
  100.     GLfloat x, y, z;
  101.     int state = END;
  102.     int read;
  103.     fp = fopen(fname, "r");
  104.     if (!fp) {
  105.         printf("can't open file %sn", fname);
  106. exit(1);
  107.     }
  108.     glNewList(PLANE, GL_COMPILE);
  109.     while(!feof(fp))
  110.     {
  111. switch(state)
  112. {
  113. case END:
  114.     read = fscanf(fp, " v");
  115.     if(read < 0) /* hit eof */
  116. break;
  117.     state = VERTS;
  118.     glBegin(GL_LINE_STRIP);
  119.     break;
  120. case VERTS:
  121.     read = fscanf(fp, " %f %f %f", &x, &y, &z);
  122.     if(read == 3)
  123. glVertex3f(x, y, z);
  124.     else
  125.     {
  126. fscanf(fp, " e");
  127. glEnd();
  128. state = END;
  129.     }
  130.     break;
  131. }
  132.     }
  133.     glEndList();
  134.     fclose(fp);
  135. }
  136. void redraw(void)
  137. {
  138.     glClear(GL_COLOR_BUFFER_BIT);
  139.     glPushMatrix();
  140.     glRotatef(objangle[X], 0.f, 1.f, 0.f); /* rotate object */
  141.     glRotatef(objangle[Y], 1.f, 0.f, 0.f);
  142.     glScalef(scale, scale, scale);
  143.     glCallList(PLANE);
  144.     glPopMatrix();
  145.     if(dblbuf)
  146. glutSwapBuffers(); 
  147.     else
  148. glFlush(); 
  149.     CHECK_ERROR("OpenGL Error in redraw()");
  150. }
  151. int main(int argc, char **argv)
  152. {
  153.     glutInit(&argc, argv);
  154.     glutInitWindowSize(winWidth, winHeight);
  155.     if(argc > 1)
  156.     {
  157. char *args = argv[1];
  158. GLboolean done = GL_FALSE;
  159. while(!done)
  160. {
  161.     switch(*args)
  162.     {
  163.     case 's': /* single buffer */
  164. printf("Single Bufferedn");
  165. dblbuf = GL_FALSE;
  166. break;
  167.     case '-': /* do nothing */
  168. break;
  169.     case 0:
  170. done = GL_TRUE;
  171. break;
  172.     }
  173.     args++;
  174. }
  175.     }
  176.     if(dblbuf)
  177. glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
  178.     else
  179. glutInitDisplayMode(GLUT_RGBA);
  180.     (void)glutCreateWindow("load and draw a wireframe image");
  181.     glutDisplayFunc(redraw);
  182.     glutReshapeFunc(reshape);
  183.     glutKeyboardFunc(key);
  184.     glutMotionFunc(motion);
  185.     glutMouseFunc(mouse);
  186.     glMatrixMode(GL_PROJECTION);
  187.     glOrtho(-1., 1., -1., 1., -5., 5.);
  188.     glMatrixMode(GL_MODELVIEW);
  189.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  190.     glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
  191.     loader("../data/f15.data");
  192.     CHECK_ERROR("OpenGL Error in main()");
  193.     key('?', 0, 0); /* print usage message */
  194.     glutMainLoop();
  195.     return 0;             /* ANSI C requires main to return int. */
  196. }