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

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. #include <string.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <math.h>
  9. #include <GL/glut.h>
  10. int *dials, *buttons;
  11. int numdials, numbuttons;
  12. int dw, bw;
  13. /* Some <math.h> files do not define M_PI... */
  14. #ifndef M_PI
  15. #define M_PI 3.14159265358979323846
  16. #endif
  17. void
  18. drawCircle(int x, int y, int r, int dir)
  19. {
  20.    float angle;
  21.    glPushMatrix();
  22.    glTranslatef(x,y,0);
  23.    glBegin(GL_TRIANGLE_FAN);
  24.    glVertex2f(0,0);
  25.    for(angle = 2*M_PI; angle >= 0; angle -= M_PI/12) {
  26.       glVertex2f(r*cos(angle),r*sin(angle));
  27.    }
  28.    glEnd();
  29.    glColor3f(0,0,1);
  30.    glBegin(GL_LINES);
  31.    glVertex2f(0,0);
  32.    glVertex2f(r*cos(dir*M_PI/180),r*sin(dir*M_PI/180));
  33.    glEnd();
  34.    glPopMatrix();
  35. }
  36. void
  37. displayDials(void)
  38. {
  39.   int i;
  40.   glClear(GL_COLOR_BUFFER_BIT);
  41.   for(i=0;i<numdials;i++) {
  42.     glColor3f(0, 1, 0);
  43.     drawCircle(100 + (i%2) * 100, 100 + (i/2) * 100, 40, -dials[i]+90);
  44.   }
  45.   glutSwapBuffers();
  46. }
  47. void
  48. displayButtons(void)
  49. {
  50.   int i, n;
  51.   glClear(GL_COLOR_BUFFER_BIT);
  52.   glBegin(GL_QUADS);
  53.   for(i=0,n=0;i<32;i++,n++) {
  54.     switch(n) {
  55.     case 0:
  56.     case 5:
  57.     case 30:
  58.       n++;
  59.     }
  60.     if(buttons[i]) {
  61.       glColor3f(1,0,0);
  62.     } else {
  63.       glColor3f(1,1,1);
  64.     }
  65.     glVertex2f((n%6)*40+10,(n/6)*40+10);
  66.     glVertex2f((n%6)*40+30,(n/6)*40+10);
  67.     glVertex2f((n%6)*40+30,(n/6)*40+30);
  68.     glVertex2f((n%6)*40+10,(n/6)*40+30);
  69.   }
  70.   glEnd();
  71.   glutSwapBuffers();
  72. }
  73. void
  74. reshape(int w, int h)
  75. {
  76.   glViewport(0, 0, w, h);
  77.   glMatrixMode(GL_PROJECTION);
  78.   glLoadIdentity();
  79.   gluOrtho2D(0, w, 0, h);
  80.   if(glutGetWindow() == bw) {
  81.      glScalef(1, -1, 1);
  82.      glTranslatef(0, -h, 0);
  83.   }
  84.   glMatrixMode(GL_MODELVIEW);
  85. }
  86. void
  87. dodial(int dial, int value)
  88. {
  89.   dials[dial - 1] = value % 360;
  90.   glutPostWindowRedisplay(dw);
  91. }
  92. void
  93. dobutton(int button, int state)
  94. {
  95.   if(button <= numbuttons) {
  96.     buttons[button-1] = (state == GLUT_DOWN);
  97.     glutPostWindowRedisplay(bw);
  98.   }
  99. }
  100. int
  101. main(int argc, char **argv)
  102. {
  103.   glutInit(&argc, argv);
  104.   numdials = glutDeviceGet(GLUT_NUM_DIALS);
  105.   if(numdials <= 0) {
  106.      fprintf(stderr, "dials: No dials availablen");
  107.      exit(1);
  108.   }
  109.   numbuttons = glutDeviceGet(GLUT_NUM_BUTTON_BOX_BUTTONS);
  110.   dials = (int*) calloc(numdials, sizeof(int));
  111.   buttons = (int*) calloc(numbuttons, sizeof(int));
  112.   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  113.   glutInitWindowSize(300, ((numdials+1)/2) * 100 + 100);
  114.   dw = glutCreateWindow("GLUT dials");
  115.   glClearColor(0.5, 0.5, 0.5, 1.0);
  116.   glLineWidth(3.0);
  117.   glutDialsFunc(dodial);
  118.   glutButtonBoxFunc(dobutton);
  119.   glutDisplayFunc(displayDials);
  120.   glutReshapeFunc(reshape);
  121.   glutInitWindowSize(240, 240);
  122.   bw = glutCreateWindow("GLUT button box");
  123.   glClearColor(0.5, 0.5, 0.5, 1.0);
  124.   glutDisplayFunc(displayButtons);
  125.   glutReshapeFunc(reshape);
  126.   glutDialsFunc(dodial);
  127.   glutButtonBoxFunc(dobutton);
  128.   glutMainLoop();
  129.   return 0;             /* ANSI C requires main to return int. */
  130. }