// DIBUJO DE LINEAS A COLORES CON VENTANA Y MENU // ___________________________________________________________________________________________________________ // OBJETIVO: Se crea una ventana vacIa. Se accesa a un menU pulsando la tecla derecha del ratOn // El menU es contextual. Para crear menUs pull - down hay que utilizar QT (se instala aparte) // COMPILAR: // gcc -o Proyecto_1 Proyecto_1.c -lGL -lGLU -lglut -pthread -lm // EJECUTAR: // ./Proyecto_1 // ___________________________________________________________________________________________________________ #include <GL/gl.h> #include <GL/glut.h> #include <math.h> #define R_LINEAS 1 #define R_ABANICO 2 #define R_BORRAR 3 #define R_SALIR 4 #define R_AZUL 5 #define R_AMARILLO 6 void Evento_Menu (int); void Demo_Lineas(void); void Demo_Abanico(void); int R_ACTUAL = 3, R_COLOR = R_AZUL; void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); // GL_FLAT = rellena con el color activo del Ultimo parAmetro // GL_SMOOTH = interpolaciOn de colores int Sub_Demo, Sub_Color; Sub_Demo=glutCreateMenu(Evento_Menu); glutAddMenuEntry("Lineas", R_LINEAS); glutAddMenuEntry("Abanico", R_ABANICO); Sub_Color=glutCreateMenu(Evento_Menu); glutAddMenuEntry("Azul", R_AZUL); glutAddMenuEntry("Amarillo", R_AMARILLO); glutCreateMenu(Evento_Menu); glutAddSubMenu("Color", Sub_Color); glutAddSubMenu("Demos", Sub_Demo); glutAddMenuEntry("Borrar Pantalla", R_BORRAR); glutAddMenuEntry("Salir", R_SALIR); glutAttachMenu(GLUT_RIGHT_BUTTON); } void Evento_Menu(int Opcion) { switch ( Opcion ) { case R_LINEAS: R_ACTUAL = R_LINEAS; break; case R_ABANICO: R_ACTUAL = R_ABANICO; break; case R_BORRAR: R_ACTUAL = R_BORRAR; break; case R_AZUL: R_COLOR = R_AZUL; break; case R_AMARILLO: R_COLOR = R_AMARILLO; break; case R_SALIR: exit(0); } } void Crea_Ambiente() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (R_COLOR == R_AZUL) glColor3f (0.0, 0.0, 1.0); if (R_COLOR == R_AMARILLO) glColor3f (0.0, 1.0, 1.0); switch ( R_ACTUAL ) { case R_LINEAS: Demo_Lineas(); break; case R_ABANICO: Demo_Abanico(); break; case R_BORRAR: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); break; case R_SALIR: exit(0); } } void drawOneLine(float x1, float y1, float x2, float y2) { glBegin(GL_LINES); glVertex2f (x1, y1); glVertex2f (x2, y2); glEnd(); } void Demo_Abanico( void ) { GLfloat angulo; int i; glBegin(GL_LINES); for (i=0; i<360; i+=3) { angulo = (GLfloat)i*3.14159f/180.0f; // grados a radianes glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(500*cos(angulo), 500*sin(angulo), 0.0f); } glEnd(); glFlush (); } void Demo_Lineas( void ) { int i; // select white for all lines // in 1st row, 3 lines, each with a different stipple glEnable (GL_LINE_STIPPLE); glLineStipple (1, 0x0101); // dotted drawOneLine (50.0, 125.0, 150.0, 125.0); glLineStipple (1, 0x00FF); // dashed drawOneLine (150.0, 125.0, 250.0, 125.0); glLineStipple (1, 0x1C47); // dash/dot/dash drawOneLine (250.0, 125.0, 350.0, 125.0); // in 2nd row, 3 wide lines, each with different stipple glLineWidth (5.0); glLineStipple (1, 0x0101); // dotted drawOneLine (50.0, 100.0, 150.0, 100.0); glLineStipple (1, 0x00FF); // dashed drawOneLine (150.0, 100.0, 250.0, 100.0); glLineStipple (1, 0x1C47); // dash/dot/dash drawOneLine (250.0, 100.0, 350.0, 100.0); glLineWidth (1.0); // in 3rd row, 6 lines, with dash/dot/dash stipple // as part of a single connected line strip glLineStipple (1, 0x1C47); // dash/dot/dash glBegin (GL_LINE_STRIP); for (i = 0; i < 7; i++) glVertex2f (50.0 + ((GLfloat) i * 50.0), 75.0); glEnd (); // in 4th row, 6 independent lines with same stipple for (i = 0; i < 6; i++) drawOneLine (50.0 + ((GLfloat) i * 50.0), 50.0, 50.0 + ((GLfloat)(i+1) * 50.0), 50.0); // in 5th row, 1 line, with dash/dot/dash stipple // and a stipple repeat factor of 5 glLineStipple (5, 0x1C47); // dash/dot/dash drawOneLine (50.0, 25.0, 350.0, 25.0); glDisable (GL_LINE_STIPPLE); glFlush (); } // ________________________________________________ // ParAmetros por si cambia de dimensiOn la ventana // ------------------------------------------------ void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluOrtho2D (-(GLdouble) w, (GLdouble) w, -(GLdouble) h, (GLdouble) h); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition (100, 100); glutInitWindowSize (600, 600); glutCreateWindow (argv[0]); init (); glutDisplayFunc(Crea_Ambiente); glutReshapeFunc(reshape); glutMainLoop(); return 0; }