jueves, 18 de febrero de 2010

En el caso de esta semana, debía crear la imagen de un árbol usando un patrón.

Ya antes había leido un articulo de como crear imagenes de árboles utilizando fractales, así que me dirigi a leer el mismo articulo, pero no lo encontre, en su defecto encontre este articulo:
http://cs.uccs.edu/~semwal/IASTED_EMS2006/ERIC_UPCHURCH/CS%20579%20Term%20Report%20-%20Upchurch.doc

Así que mi primer aproximación al problema de generar la imagen de un árbol fue la de usar la idea de fractales.

Primero empece con una idea bastante simple, crear una linea recta para el tronco, despues, a este tronco le pondríamos "ramas" que simplemente serían otras lineas rectas saliendo de la primer linea recta, estas nuevas lineas serían de longitud proporcional a la longitud del "tronco" @ veces mas pequeñas.
Luego, a las nuevas "ramas" también le crecerían ramas con longitud @ veces mas pequeñas.

El angulo en el cual las ramas crecerían de su rama padre sería generado aleatoriamente.

Como C++ es el lenguaje que mas recientemente he manejado, pues comence a programar en este lenguaje, pero para mi sorpresa C++ no incluye librerias para graficar por default, y mi intento por instalar estas librerias fueron en vano.

Así que despues empece a realizar el mismo programa en Matlab.

El programa basicamente generaba un número aleatorio y en base a ese número decidia en que lugar de la rama padre iba a crecer la rama hija (en un árbol las ramas no crecen a la misma distancia), despues generaba otro número aleatorio para conocer el angulo de inclinación de la rama hija, y como la longitud de esta rama era @ veces mas pequeña que la del padre podíamos calcular el punto final en el que iba a estar esta rama, posteriormente solo había que graficar una linea recta que uniera estos dos puntos.

Me tope con muchos problemas, puesto que la función plot, de matlab si yo soy un plot(x,y) y posteriormente hago otro plot(x2,y2), esta otra grafica no la sobrepone junto a la otra grafica, si no que solo borra la pasada y crea esta, algo muy malo para nuestro algoritmo, pues en mi algoritmo generamos cada una rama a la ves.
Despues de mucho debanarme los cesos y buscar por internet encontre una función, hold on, que lo que hace es, cuando creas una grafica y luego creas otra grafica, la vieja grafica aun aparece junto a la nueva grafica.

El problema de este metodo fue que, al generar la nueva grafica, matlab mueve el centro de la grafica a la nueva grafica, y si la grafica anterior queda fuera de toma, pues parece que a veces las desaparece.




Lo que tiene el gran problema de parecer que ciertas lineas se encuentran flotando en el aire.
Para generar esta imagen de "árbol" se inicio con un tronco de longitud 1, cada padre tenía 5 ramas, la reducción se tamaño fue de 1.8 y el numero de iteraciones fue 200.

@=1.8, hijos =7, longitudinicial=1, iteraciones = 200

En esta imagen se aprecía un claro error en nuestra simulación, tenemos ramas del arbol, que llegan mas abajo del suelo, y aunque existen algunas especies de árboles cuyas ramas se convierten en raices, este no era el objetivo de esta simulación.

@=3, hijos=15, iteraciones=200, longitudinicial=4, las ramas solo tiene angulos entre 0º y 180º

En esta imagen vemos el claro problema de las lineas fantasmas.
El lado derecho de la imagen tiene una forma mas "arbolesca".


Trabajo que futuro sería obviamente el evitar la aparición de ramas fantasmas, el de alguna forma restringir el angulo en el que crecen las ramas, por ejemplo que no puedan crecer con angulo 320º si esto hace que la rama traspase el suelo, que ramas no se atraviesen entre si.


Bueno, la almohada me susurro en que me había equivocado con lo de las ramas fantasmas.

@=2, hijos=5, iteraciones=500, longitud inicial = 2

Este ya se ve un poco mas arboleo

Un árbol sacudido por un huracan es mas facil:
@=2.5, hijos=15, iteraciones=200 y jugar con que sea mas probable que las ramas esten con cierto angulo

Algo que puede ser facilmente implementado es la creación de "hojas" al final de las ramas, esto se puede lograr creando una elipse cuyos focos esten en la rama y con una excentricidad aleatoria.

No hay comentarios:

Publicar un comentario