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