/* 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;
}