/* DIBUJO DE N FIGURAS */ #include <stdlib.h> #include <string.h> #include <stdio.h> #include <GL/glut.h> #include <unistd.h> void Consola(); void Dibuja(); struct XY { int x, y; struct XY *Sig; }; struct Todo { struct XY *Fig; struct Todo *Sig; }; struct Todo *Figuras = NULL; void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); // color de borrado -negro- glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-15.0, 15.0, -15.0, 15.0, -15.0, 15.0); glMatrixMode(GL_MODELVIEW); } void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); } void PintaEjes() { glBegin(GL_LINES); glColor3f(1,0,0); glVertex3f(-10, 0, 0); glVertex3f(10,0, 0); glColor3f(0,1,0); glVertex3f(0, 10, 0); glVertex3f(0,-10, 0); glEnd(); } void display(void) { glClear (GL_COLOR_BUFFER_BIT); // borra la pantalla PintaEjes(); Dibuja(); glFlush (); // Vacia el buffer de dibujo sleep(1); //exit(0); } void Dibuja( ) { struct XY *Figura = NULL; struct Todo *TodasLasFig = Figuras; int Cont = 0; while( TodasLasFig ) { Figura = TodasLasFig->Fig; Cont = 0; while( Figura ) { Cont++; Figura = Figura->Sig; } Figura = TodasLasFig->Fig; if (Cont == 1) { glBegin(GL_POINTS); glColor3f(1,1,1); glVertex3f(Figura->x, Figura->y, 0); glEnd(); } if (Cont == 2) { glBegin(GL_LINES); glColor3f(1,1,1); glVertex3f(Figura->x, Figura->y, 0); Figura = Figura->Sig; glVertex3f(Figura->x, Figura->y, 0); glEnd(); } if (Cont == 3) { glBegin(GL_TRIANGLES); glColor3f(1,1,1); glVertex3f(Figura->x, Figura->y, 0); Figura = Figura->Sig; glVertex3f(Figura->x, Figura->y, 0); Figura = Figura->Sig; glVertex3f(Figura->x, Figura->y, 0); glEnd(); } if (Cont == 4) { glBegin(GL_QUADS); glColor3f(1,1,1); glVertex3f(Figura->x, Figura->y, 0); Figura = Figura->Sig; glVertex3f(Figura->x, Figura->y, 0); Figura = Figura->Sig; glVertex3f(Figura->x, Figura->y, 0); Figura = Figura->Sig; glVertex3f(Figura->x, Figura->y, 0); glEnd(); } TodasLasFig = TodasLasFig->Sig; } } int Compara(int x, int y, struct XY *FIG) { if (FIG) while(FIG->Sig) FIG = FIG->Sig; // si sí existe, se coloca al final if (FIG && FIG->x == x && FIG->y == y) return 1; // existe el nodo y coinciden con Xini y Yini? return 0; } struct XY *PideDatos() { int k = 0, x, y; struct XY *Fig1 = NULL, *Nuevo=NULL; printf("Se finaliza si Xnew y Ynew coinciden con Xini y Yini ...\n"); while (!k) { printf("Datos x, y: "); scanf("%d, %d", &x, &y); k = Compara(x,y, Fig1); if ( !k ) { Nuevo= (struct XY*)malloc(sizeof(struct XY)); Nuevo->x=x; Nuevo->y = y; Nuevo->Sig = NULL; if (!Fig1) Fig1 = Nuevo; else { Nuevo->Sig = Fig1; Fig1 = Nuevo; } } } return Fig1; } void Consola( ) { struct XY *Fig = NULL; struct Todo *NuevaFig=NULL; int Salir = 0; char Opcion[10]; while( !Salir ) { printf("OPCIONES: [PideDatos] [Dibuja] [Salir] [Borrar]\n"); printf("==> "); scanf("%s", Opcion); if ( !strcasecmp(Opcion,"Salir") ) exit(0); if ( !strcasecmp(Opcion,"PideDatos") ) { Fig = PideDatos(); NuevaFig = (struct Todo*)malloc(sizeof(struct Todo)); NuevaFig->Fig = Fig; NuevaFig->Sig = NULL; if ( !Figuras ) Figuras =NuevaFig; else NuevaFig->Sig = Figuras; Figuras = NuevaFig; } if ( !strcasecmp(Opcion,"Dibuja") ) { display(); } } } int main(int argc, char** argv) { glutInit(&argc, argv); // Inicializa la libreria auxiliar GLUT glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); // Inicializa el modo de visualizacion glutInitWindowSize (500, 500); // Indica el tamano de la ventana (ancho,alto) glutInitWindowPosition (100, 100); // Indica la posiciOn inicial (xmin,ymin) glutCreateWindow ("DIBUJO DE N FIGURAS"); // Abre la ventana con el tItulo indicado init (); // Inicializar valores glutDisplayFunc(display); // Indica cual es la funciOn de dibujo glutReshapeFunc(reshape); // FunciOn cuando se modifica la ventana glutIdleFunc(Consola); // FunciOn que se activa cuando hace nada glutMainLoop(); // Comienza el bucle de dibujo y proceso de eventos. Consola( ); return 0; }