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