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

GIS编程

开发平台:

Visual C++

  1. /* resolution.c */
  2. /* by Walter Vannini (walterv@jps.net, waltervannini@hotmail.com) */
  3. /* Copyright (c) Walter Vannini, 1998.  */
  4. /* This program is freely distributable without licensing fees  and is
  5.    provided without guarantee or warrantee expressed or implied. This
  6.    program is -not- in the public domain. */
  7. /* This example demonstrates how to use glCopyPixels with glPixelZoom
  8.    to zoom up small renderings to fill more pixels. */
  9. #include <GL/glut.h>
  10. #include <stdlib.h>
  11. void init(void);
  12. void KeyboardFunc(unsigned char key, int x, int y);
  13. void MenuFunc(int value);
  14. void IdleFunc(void);
  15. void ReshapeFunc(int w, int h);
  16. void DisplayFunc(void);
  17. struct ProgramState
  18. {
  19.  double w;
  20.  double h;
  21.  double ResolutionX;
  22.  double ResolutionY;
  23.  int shoulder;
  24.  int elbow;
  25.  int wrist;
  26.  double Rotation;
  27.  double RotationIncrement;
  28. };
  29. struct ProgramState ps;
  30. void init(void)
  31. {
  32.  glShadeModel (GL_FLAT);
  33.  glDisable(GL_DITHER);
  34.  glClearColor(0.0, 0.0, 0.0, 1.0);
  35.  ps.Rotation = 0.0;
  36.  ps.RotationIncrement = 4.0;
  37.  ps.ResolutionX = 1.0;
  38.  ps.ResolutionY = 1.0;
  39.  ps.shoulder = 0.0;
  40.  ps.elbow = 0.0;
  41.  ps.wrist = 0.0;
  42. }
  43. void KeyboardFunc (unsigned char key, int x, int y)
  44. {
  45.  switch (key)
  46.  {
  47.  case '1':
  48.   ps.ResolutionX = 1;
  49.   ps.ResolutionY = 1;
  50.   glutPostRedisplay();
  51.   break;
  52.  case '2':
  53.   ps.ResolutionX = 2;
  54.   ps.ResolutionY = 2;
  55.   glutPostRedisplay();
  56.   break;
  57.  case '3':
  58.   ps.ResolutionX = 3;
  59.   ps.ResolutionY = 3;
  60.   glutPostRedisplay();
  61.   break;
  62.  case '4':
  63.   ps.ResolutionX = 4;
  64.   ps.ResolutionY = 4;
  65.   glutPostRedisplay();
  66.   break;
  67.  case '5':
  68.   ps.ResolutionX = 5;
  69.   ps.ResolutionY = 5;
  70.   glutPostRedisplay();
  71.   break;
  72.  case '6':
  73.   ps.ResolutionX = 6;
  74.   ps.ResolutionY = 6;
  75.   glutPostRedisplay();
  76.   break;
  77.  case '7':
  78.   ps.ResolutionX = 7;
  79.   ps.ResolutionY = 7;
  80.   glutPostRedisplay();
  81.   break;
  82.  case '8':
  83.   ps.ResolutionX = 8;
  84.   ps.ResolutionY = 8;
  85.   glutPostRedisplay();
  86.   break;
  87.  case '9':
  88.   ps.ResolutionX = 9;
  89.   ps.ResolutionY = 9;
  90.   glutPostRedisplay();
  91.   break;
  92.  case '0':
  93.   ps.ResolutionX = 10;
  94.   ps.ResolutionY = 10;
  95.   glutPostRedisplay();
  96.   break;
  97.  case '-':
  98.   ps.ResolutionX = 16;
  99.   ps.ResolutionY = 16;
  100.   glutPostRedisplay();
  101.   break;
  102.  case '=':
  103.   ps.ResolutionX = 32;
  104.   ps.ResolutionY = 32;
  105.   glutPostRedisplay();
  106.   break;
  107.  case '\':
  108.   ps.ResolutionX = 64;
  109.   ps.ResolutionY = 64;
  110.   glutPostRedisplay();
  111.   break;
  112.  case 'o':
  113.   ps.ResolutionX = 1;
  114.   ps.ResolutionY = 8;
  115.   glutPostRedisplay();
  116.   break;
  117.  case 'e':
  118.   ps.ResolutionX = 8;
  119.   ps.ResolutionY = 1;
  120.   glutPostRedisplay();
  121.   break;
  122.  case 'q':
  123.  case 'Q':
  124.  case 27:
  125.   exit(0);
  126.   break;
  127.  default:
  128.   break;
  129.  }
  130. }
  131. void MenuFunc(int value)
  132. {
  133.  KeyboardFunc((unsigned char) value, 0, 0);
  134. }
  135. void IdleFunc(void)
  136. {
  137.  ps.Rotation += ps.RotationIncrement;
  138.  ps.shoulder = ps.Rotation;
  139.  ps.elbow = ps.Rotation*0.63432;
  140.  ps.wrist = ps.Rotation*0.4313543;
  141.  glutPostRedisplay();
  142. }
  143. void ReshapeFunc (int w, int h)
  144. {
  145.  ps.w =w;
  146.  ps.h = h;
  147.  glMatrixMode (GL_PROJECTION);
  148.  glLoadIdentity ();
  149.  gluPerspective(65.0, ps.w/ps.h, 1.0, 20.0);
  150.  glMatrixMode(GL_MODELVIEW);
  151.  glLoadIdentity();
  152.  glTranslatef (0.0, 0.0, -5.0);
  153. }
  154. void DisplayFunc(void)
  155. {
  156.  double ForearmLength= 1.2;
  157.  double UpperarmLength =1.0;
  158.  double HandLength = 0.5;
  159.  glViewport (0.0, 0.0, (GLsizei) (ps.w/ps.ResolutionX), (GLsizei) (ps.h/ps.ResolutionY));
  160.  glMatrixMode(GL_MODELVIEW);
  161.  glClear (GL_COLOR_BUFFER_BIT);
  162.  glPushMatrix();
  163.  {
  164.   glRotatef (ps.shoulder, 0.0, 0.0, 1.0);
  165.   glTranslatef (0.5*UpperarmLength, 0.0, 0.0);
  166.   glPushMatrix();
  167.   {
  168.    glScalef (UpperarmLength, 0.6, 1.0);
  169.    glutWireCube (1.0);
  170.   }
  171.   glPopMatrix();
  172.   glTranslatef (0.5*UpperarmLength, 0.0, 0.0);
  173.   glRotatef (ps.elbow, 0.0, 0.0, 1.0);
  174.   glTranslatef (0.5*ForearmLength, 0.0, 0.0);
  175.   glPushMatrix();
  176.   {
  177.    glScalef (ForearmLength, 0.4, 1.0);
  178.    glutWireCube (1.0);
  179.   }
  180.   glPopMatrix();
  181.   glTranslatef (0.5*ForearmLength, 0.0, 0.0);
  182.   glRotatef (ps.wrist, 0.0, 0.0, 1.0);
  183.   glTranslatef (0.5*HandLength, 0.0, 0.0);
  184.   glPushMatrix();
  185.   {
  186.    glScalef (HandLength, 0.2, 1.0);
  187.    glutWireCube (1.0);
  188.   }
  189.   glPopMatrix();
  190.  }
  191.  glPopMatrix();
  192.  glPixelZoom(ps.ResolutionX, ps.ResolutionY);
  193.  glCopyPixels(0.0,0.0,
  194.   (GLsizei) (ps.w/ps.ResolutionX), (GLsizei) (ps.h/ps.ResolutionY), GL_COLOR);
  195.  glutSwapBuffers();
  196. }
  197. void
  198. VisibilityFunc(int vis)
  199. {
  200.   if (vis == GLUT_VISIBLE) {
  201.     glutIdleFunc(IdleFunc);
  202.   } else {
  203.     glutIdleFunc(NULL);
  204.   }
  205. }
  206. int main(int argc, char** argv)
  207. {
  208.  glutInit(&argc, argv);
  209.  glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
  210.  ps.h=500;
  211.  ps.w=500;
  212.  glutInitWindowSize ((int) ps.w, (int) ps.h);
  213.  glutInitWindowPosition (100, 100);
  214.  glutCreateWindow (argv[0]);
  215.  init ();
  216.  glutVisibilityFunc(VisibilityFunc);
  217.  glutDisplayFunc(DisplayFunc);
  218.  glutReshapeFunc(ReshapeFunc);
  219.  glutKeyboardFunc(KeyboardFunc);
  220.  glutCreateMenu(MenuFunc);
  221.  glutAddMenuEntry("resolution 1x1", '1');
  222.  glutAddMenuEntry("resolution 2x2", '2');
  223.  glutAddMenuEntry("resolution 3x3", '3');
  224.  glutAddMenuEntry("resolution 4x4", '4');
  225.  glutAddMenuEntry("resolution 5x5", '5');
  226.  glutAddMenuEntry("resolution 6x6", '6');
  227.  glutAddMenuEntry("resolution 7x7", '7');
  228.  glutAddMenuEntry("resolution 8x8", '8');
  229.  glutAddMenuEntry("resolution 9x9", '9');
  230.  glutAddMenuEntry("resolution 10x10", '0');
  231.  glutAddMenuEntry("resolution 16x16", '-');
  232.  glutAddMenuEntry("resolution 32x32", '=');
  233.  glutAddMenuEntry("resolution 64x64", '\');
  234.  glutAddMenuEntry("resolution 1x8", 'o');
  235.  glutAddMenuEntry("resolution 8x1", 'e');
  236.  glutAttachMenu(GLUT_RIGHT_BUTTON);
  237.  glutMainLoop();
  238.  return 0;
  239. }