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