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

GIS编程

开发平台:

Visual C++

  1. /* lineblend.c
  2.  * 
  3.  * To compile: cc -o lineblend lineblend.c -lGL -lGLU -lX11 -lglut -lXmu
  4.  *
  5.  * Usage: lineblend
  6.  *
  7.  * This is an puffed up version of the first GL assignment we had for my
  8.  * graphics class: write a 2-d openGL program w/ color and interactivity.
  9.  *
  10.  * Left and middle buttons drawn colored lines, right button brings up a menu
  11.  * with a few options.  If you draw for long enough and then hit pick
  12.  * "redraw" (or resize or uncover the window) it takes so long to redraw
  13.  * all the lines it is kind of like a kaleidoscope animation. Or something.
  14.  *
  15.  * Philip Winston - 2/11/95  (modified: 2/12)
  16.  * pwinston@hmc.edu
  17.  * http://www.cs.hmc.edu/people/pwinston
  18.  *        
  19.  */
  20. #include <GL/glut.h>
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #ifdef _WIN32
  24. #define drand48() (((float) rand())/((float) RAND_MAX))
  25. #endif
  26. typedef enum {MENU_ALPHA_1, MENU_ALPHA_2,  MENU_ALPHA_3, MENU_ALPHA_4,
  27.               MENU_COLOR_1, MENU_COLOR_2,  MENU_COLOR_3, MENU_COLOR_4,
  28.               MENU_ANTI_ON, MENU_ANTI_OFF,
  29.               MENU_ERASE,   MENU_REDRAW,   MENU_QUIT} MenuChoices;
  30. typedef enum {SC1, SC2, SC3, SC4} ColorScheme;
  31. int wwidth, wheight, downbtn = -1, downx, downy;
  32. GLuint DispLists = 1;
  33. GLfloat Alpha = 0.2;
  34. int Color = SC1;
  35. void myglInit(void)
  36. {
  37.   glLineWidth(10.0);
  38.   glEnable(GL_BLEND);
  39.   glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  40.   glMatrixMode(GL_PROJECTION);
  41.   glLoadIdentity();
  42.   gluOrtho2D(-0.5,0.5,-0.5,0.5);
  43.   glMatrixMode(GL_MODELVIEW);
  44.   glLoadIdentity();
  45.   glFlush();
  46. void myreshape(GLsizei w, GLsizei h)
  47. {
  48.   wwidth = w; wheight = h;
  49.   glViewport(0,0,w,h);
  50.   glClear(GL_COLOR_BUFFER_BIT);
  51.   glFlush();
  52. }
  53. void mydisplay(void)
  54. {
  55.   GLuint i;
  56.   glClear(GL_COLOR_BUFFER_BIT);
  57.   for (i = 0; i < DispLists; i++)
  58.     glCallList(i);
  59.   glFlush();
  60. }
  61. void drawline(int x, int y)
  62. {
  63.   GLfloat fx =   (float)(x - downx)/wwidth,
  64.           fy = -((float)(y - downy)/wheight),
  65.           r1, g1, b1, r2, g2, b2;
  66.   switch(Color) {      /* four different ways to pick colors */
  67.     case SC1:          /* just kind of random formulas...    */
  68.       r1 = fy+1; g1 = 0;    b1 = (float)x/wwidth;
  69.       r2 = 0;    g2 = fy+1; b2 = 1-(float)x/wwidth;
  70.       break;
  71.     case SC2:
  72.       r1 = fx+fy+1; g1 = 0;       b1 = 0;
  73.       r2 = 0;       g2 = fx+fy+1; b2 = 0;
  74.       break;
  75.     case SC3:
  76.       r1 = 0;   g1 = (float)downx/wwidth; b1 = (float)x/wwidth;
  77.       r2 = 0;   g2 = (float)y/wheight; b2 = (float)downy/wheight;
  78.       break;
  79.     case SC4:
  80.       r1 = drand48(); g1 = drand48(); b1 = (float)downx/(wwidth*1.5);
  81.       r2 = drand48(); g2 = (float)downy/(wheight*1.5); b2 = drand48();
  82.       break;
  83.   }
  84.   glBegin(GL_LINES);
  85.         glColor4f(r1, g1, b1, Alpha);
  86.     switch(downbtn) {
  87.       case GLUT_LEFT_BUTTON:   glVertex2f(0,0);     break;        
  88.       case GLUT_MIDDLE_BUTTON: glVertex2f(-fx,-fy); break;
  89.       }
  90.     glColor4f(r2, g2, b2, Alpha); glVertex2f(fx,fy);
  91.   glEnd();
  92.   glFlush();
  93. }
  94. void mousebutton(int btn, int state, int x, int y)
  95. {
  96.   GLfloat fx =  (float)x/wwidth - 0.5,
  97.           fy = -(float)y/wheight + 0.5;
  98.   if (state == GLUT_DOWN && downbtn == -1) {
  99.     glNewList(DispLists++, GL_COMPILE_AND_EXECUTE);
  100.     glPushMatrix();
  101.     glTranslatef(fx, fy, 0);
  102.     downbtn = btn;
  103.     downx = x;
  104.     downy = y;
  105.     drawline(x, y);
  106.   } else if (state == GLUT_UP && btn == downbtn) {
  107.     glPopMatrix();
  108.     glEndList();
  109.     downbtn = -1;
  110.   }
  111. }
  112. /*
  113.  * For some reason I felt like doing these check boxes -- it is kind of
  114.  * lame the way I did it, though.  Probably a smarter and easier way.
  115.  */
  116. void handlealphamenu(int value)
  117. {
  118.   glutChangeToMenuEntry(1,"[   ] 0.05", MENU_ALPHA_1);  
  119.   glutChangeToMenuEntry(2,"[   ] 0.20", MENU_ALPHA_2);
  120.   glutChangeToMenuEntry(3,"[   ] 0.50", MENU_ALPHA_3);
  121.   glutChangeToMenuEntry(4,"[   ] 1.00", MENU_ALPHA_4);
  122.   switch (value) {
  123.     case MENU_ALPHA_1:
  124.       glutChangeToMenuEntry(1, "[ * ] 0.05", MENU_ALPHA_1);  
  125.       Alpha = 0.05; break;
  126.     case MENU_ALPHA_2:
  127.       glutChangeToMenuEntry(2, "[ * ] 0.20", MENU_ALPHA_2);
  128.       Alpha = 0.2; break;
  129.     case MENU_ALPHA_3:
  130.       glutChangeToMenuEntry(3, "[ * ] 0.50", MENU_ALPHA_3);
  131.       Alpha = 0.5; break;
  132.     case MENU_ALPHA_4:
  133.       glutChangeToMenuEntry(4, "[ * ] 1.00", MENU_ALPHA_4);
  134.       Alpha = 1.0; break;
  135.     }
  136. }
  137. void handlecolormenu(int value)
  138. {
  139.   glutChangeToMenuEntry(1,"[   ] Various", MENU_COLOR_1);  
  140.   glutChangeToMenuEntry(2,"[   ] Red/Green  ", MENU_COLOR_2);
  141.   glutChangeToMenuEntry(3,"[   ] Blue/Green", MENU_COLOR_3);
  142.   glutChangeToMenuEntry(4,"[   ] Random", MENU_COLOR_4);
  143.   switch (value) {
  144.     case MENU_COLOR_1:
  145.       glutChangeToMenuEntry(1, "[ * ] Various", MENU_COLOR_1);  
  146.       Color = SC1; break;
  147.     case MENU_COLOR_2:
  148.       glutChangeToMenuEntry(2, "[ * ] Red/Green", MENU_COLOR_2);
  149.       Color = SC2; break;
  150.     case MENU_COLOR_3:
  151.       glutChangeToMenuEntry(3, "[ * ] Blue/Green", MENU_COLOR_3);
  152.       Color = SC3; break;
  153.     case MENU_COLOR_4:
  154.       glutChangeToMenuEntry(4, "[ * ] Random", MENU_COLOR_4);
  155.       Color = SC4; break;
  156.     }
  157. }
  158. void handlemenu(int value)
  159. {
  160.   switch (value) {
  161.     case MENU_ANTI_OFF:
  162.       glDisable(GL_LINE_SMOOTH);
  163.       glutChangeToMenuEntry(3, "anti-aliasing [NO]", MENU_ANTI_ON);
  164.       break;
  165.     case MENU_ANTI_ON:
  166.       glEnable(GL_LINE_SMOOTH);
  167.       glutChangeToMenuEntry(3, "anti-aliasing [YES]", MENU_ANTI_OFF);
  168.       break;
  169.     case MENU_REDRAW:
  170.       glutPostRedisplay();
  171.       break;
  172.     case MENU_ERASE:
  173.       glDeleteLists(0, DispLists);
  174.       DispLists = 1;
  175.       mydisplay();
  176.       break;
  177.     case MENU_QUIT:
  178.       exit(0);
  179.       break;
  180.     }
  181. }
  182. void myMenuInit(void)
  183. {
  184.   int sub1,sub2,sub3;
  185.   sub3 = glutCreateMenu(handlealphamenu);
  186.   glutAddMenuEntry("[   ] 0.05", MENU_ALPHA_1);  
  187.   glutAddMenuEntry("[ * ] 0.20", MENU_ALPHA_2);
  188.   glutAddMenuEntry("[   ] 0.50", MENU_ALPHA_3);
  189.   glutAddMenuEntry("[   ] 1.00", MENU_ALPHA_4);
  190.   sub2 = glutCreateMenu(handlecolormenu);
  191.   glutAddMenuEntry("[ * ] Various", MENU_COLOR_1);  
  192.   glutAddMenuEntry("[   ] Red/Green", MENU_COLOR_2);
  193.   glutAddMenuEntry("[   ] Blue/Green", MENU_COLOR_3);
  194.   glutAddMenuEntry("[   ] Random", MENU_COLOR_4);
  195.   sub1 = glutCreateMenu(handlemenu);
  196.   glutAddSubMenu("Colors", sub2);
  197.   glutAddSubMenu("Alpha", sub3);
  198.   glutAddMenuEntry("anti-aliasing [NO]", MENU_ANTI_ON);
  199.   glutCreateMenu(handlemenu);
  200.   glutAddSubMenu("Lines", sub1);
  201.   glutAddMenuEntry("Erase", MENU_ERASE);
  202.   glutAddMenuEntry("Redraw", MENU_REDRAW);
  203.   glutAddMenuEntry("Quit", MENU_QUIT);
  204.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  205. }
  206. int main(int argc, char** argv)
  207. {
  208.   glutInit(&argc, argv);
  209.   glutInitWindowSize(512, 512);
  210.   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  211.   glutCreateWindow("lineblend");
  212.   myglInit(); 
  213.   myMenuInit();
  214.   glutReshapeFunc(myreshape);
  215.   glutMouseFunc(mousebutton);
  216.   glutMotionFunc(drawline);
  217.   glutDisplayFunc(mydisplay);
  218.   glutMainLoop();
  219.   return 0;             /* ANSI C requires main to return int. */
  220. }