ARBOL_DRAW_2.c



/* DIBUJA UN ARBOL BINARIO EN PANTALLA
	- SE GENERAN LOS DATOS DEL ARBOL
	- SE HACE USO DE LA LIBRERIA OPEN_GL
	COMPILAR:		gcc -o DibujaArbol  DibujaArbol.c -lGL -lGLU -lglut -pthread
	EJECUTAR:		./DibujaArbol
======= OJO ---> ya estA dando seNales de vida   =======
	NOTAS:
==== 	(1)	ALGUNAS COORDENADAS SE CRUZAN ==== */

#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <math.h>
#include <string.h>
#define PI 3.1415926535897932

#define INC_X 0.2
#define INC_Y 0.2
double Radio = 0.05;

struct Nodo { double x, y; int Dato; struct Nodo *Raiz, *Izq, *Der; };
struct Nodo *Raiz = NULL;

void CreaArbol(struct Nodo *ARBOL, struct Nodo *Nuevo)
{
	if (Raiz == NULL) { Raiz = Nuevo; return; }
	if (Nuevo->Dato > ARBOL->Dato)
	{
		Nuevo->x += INC_X; Nuevo->y -= INC_Y;
		if (ARBOL->Der == NULL) { ARBOL->Der = Nuevo; Nuevo->Raiz = ARBOL; return; }
		else { CreaArbol(ARBOL->Der, Nuevo); }
	}
	else				// ARBOL IZQUIERDO
	{
		Nuevo->x -= INC_X; Nuevo->y -= INC_Y;
		if (ARBOL->Izq == NULL) { ARBOL->Izq = Nuevo; Nuevo->Raiz = ARBOL; return; }
		else { CreaArbol(ARBOL->Izq, Nuevo); }
	}
}

struct Nodo *Crea_Nodo(int Dato)
{
	struct Nodo *Nuevo = (struct Nodo *)malloc(sizeof(struct Nodo));
	Nuevo->Raiz = Nuevo->Der = Nuevo->Izq = NULL;		Nuevo->Dato = Dato;		Nuevo->x = Nuevo->y = 0.0; 
	return Nuevo;
}

void LeeDatos()
{	int N=0, DATOS[] = {14,15,4,9,7,18,3,5,16,4,20,17,0,14,5};
	while( N < sizeof DATOS / sizeof(int)) { CreaArbol(Raiz, Crea_Nodo(DATOS[N])); N++; }
}

void inline drawString (char *s)
{
	unsigned int i;
	for (i=0; i<strlen(s); i++) glutBitmapCharacter(GLUT_BITMAP_HELVETICA_10, s[i]);
}

void TrazaLinea( struct Nodo *ARBOL)
{
	double Xi, Yi, Xf, Yf;
	
					Xf = Xi = ARBOL->x;	Yf = Yi = ARBOL->y + 0.05;
	if ( ARBOL->Raiz != NULL ) {	Xf = ARBOL->Raiz->x;	Yf = ARBOL->Raiz->y - 0.05; }

	glBegin(GL_LINES); glColor3f(1,1,0);
		if (Xi != Xf && Yi != Yf) { glVertex3f(Xi, Yi,0.0); glVertex3f(Xf, Yf,0.0); }
	glEnd();
}

void TrazaCirculo(double x, double y, int Dato)
{
	int i=0;
	double Angulo = 0.0;
	GLint NPuntos = 100;			/* puntos en la circunferencia */
	char CAD[10];

	glBegin(GL_LINE_LOOP);  glColor3f(1,1,0);
	for (i = 0; i < NPuntos; i++)
	{
		Angulo = 2*PI*i/NPuntos; 
		glVertex2f(x+Radio*cos(Angulo), y+Radio*sin(Angulo));
	}
	glEnd();
	glRasterPos2f (x,y);
	sprintf(CAD, "%d\0", (int)Dato); drawString (CAD);
}

void DibujaArbol( struct Nodo *ARBOL )			/* recorrido en preorden */
{
	TrazaCirculo(ARBOL->x, ARBOL->y, ARBOL->Dato);
	TrazaLinea(ARBOL);
	if (ARBOL->Izq != NULL) DibujaArbol(ARBOL->Izq);
	if (ARBOL->Der != NULL) DibujaArbol(ARBOL->Der);
}

void display(void)
{
	glClearColor (0.0, 0.0, 0.0, 0.0);			/* Fondo negro en la ventana */
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	/* (1 de 3) borra la pantalla e inicializa el Z-Buffer */
	
	glMatrixMode(GL_PROJECTION);				/* Modo proyecciOn */
	glLoadIdentity();					/* Se carga la matriz identidad */
	glOrtho(-1.0, 1.0, -1.0, 0.05, -1.0, 1.0);		/* ProyecciOn ortogrAfica (izq, der, abajo, arriba, cerca z , lejos -z) -cubo- */
	glMatrixMode(GL_MODELVIEW);				/* Modo de modelado */
		DibujaArbol( Raiz );
	glFlush ();
	sleep(10);
	exit(0);
}

void inicializa (void) { int *Altura = 0; glLoadIdentity(); LeeDatos(); }

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);	/* (3 de 3) Se reserva espacio para el Z-Buffer */
	glutInitWindowSize (1250, 650);					/* Ancho y alto de la ventana */
	glutInitWindowPosition (100, 50);
	glutCreateWindow ("___   ARBOL   ___");
	inicializa ();
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}