NFig_Dibujo.c



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