Árbol Fractal Móvil Interactivo

English

Uso:

1. Arrastrar: para girar la figura completa.

2. Simple-click-izdo.: para aumentar el número de ramas.

3. Simple-click-dcho: para reducir el número de ramas.

4. Doble-click: para cambiar entre:

  • 2-D con ramas móviles
  • 3-D con ramas fijas, y
  • 3-D con planos fijos

Si no puede ver este applet, puede intentar instalar primero Java

En el Arbol Fractal 2-D las ramas pueden girar individualmente.

En el Arbol 3-D no pueden porque colisionarían.

Tree Poem

Código fuente:

MovingFractalTreeAntiAlias.java

Si sabe convertir esta app para que funcione en smartphones o tabletas, por favor contacte conmigo:

josechu2004@gmail.com

Si no puede ver el Applet Java de arriba, sí es posible que pueda ejecutar la siguiente aplicación Java .jar. que hace exactamente lo mismo:

MovingFractalTreeAntiAlias.jar

El Applet .class ha sido convertido a aplicacion.jar con la herramienta applet2app.jar de Raja Ranjan

 

Un poco de historia:

La idea del árbol 2-D estático vino a la mente del autor aproximadamente en 1967, cuando tenía 6 años.  La figura le intrigaba y solía garabatearla en sus cuadernos escolares.  Por supuesto, con proporciones no muy precisas.

Quince años más tarde, en 1982, tras leer un ensayo de la colección "sigma" de libros matemáticos en la biblioteca de la universidad, la analizó con detenimiento y se dio cuenta de sus propiedades fractales (si la longitud de las ramas de cada generación disminuyera de acuerdo a unas reglas muy simples, el árbol llenaría el plano! ¡y sin que dos ramas se solaparan nunca!). 

Esto fue una gran sorpresa y una gran satisfacción para él y aumentó su interés en el mundo de los fractales.  En ese mismo año (1982) se preguntó si podría haber una versión 3-D en la que las ramas tampoco se solapasen pero que pudieran igualmente llegar a todos los puntos, en este caso, del espacio.  Cuando se dio cuenta de que ese objeto también existía quedó fascinado y apreció, otra vez, la bella estructura de las matemáticas.

En 1984 publicó estas dos figuras estáticas, el árbol 2-D y el árbol 3-D, en la revista "Cacumen".

Pero todavía no se había dado cuenta de que, en la versión 2-D, cada rama podía rotar independiente y libremente alrededor de su rama padre sin posibilidad de "colisionar" jamás con otra.  Todo ello incluso aunque el árbol 2-D inicial tuviera millones (o infinitas) ramas.  No sucedería hasta 1987.  En ese año, en una noche de profunda inspiración, la versión plana del árbol dejó de ser estática y el fractal 2-D se convirtió en un fractal móvil.

No fue inmediato ver que, al contrario que el árbol 2-D, el árbol 3-D no podría ser móvil porque sus ramas chocarían unas con otras.

Durante años, el fractal móvil solo se movía en la cabeza del autor, todavía tardó otros diez en construir el programa que permite visualizar el árbol 2-D en movimiento.  Le faltaba un dato clave:  en abril de 1997 preguntó en el grupo de usenet sci.math cuál era la fórmula matemática para girar un punto arbitrario del espacio en torno a un eje arbitrario.  La precisa respuesta de Pertti Lounesto al final de este hilo el martes, 29 de abril de 1997 fue la llave para que, ese mismo día, pudiésemos ver el árbol rotando fractalmente en la pantalla del ordenador.

---

Véase aquí cómo girar un punto arbitrario del espacio alrededor de un eje arbitrario del espacio.

Y aquí cómo dibujar un objeto en perspectiva en la pantalla.

---

Como construir estos árboles

Para conseguir un árbol 2-D solo es necesario que cada rama nieta sea de longitud mitad que la de su rama abuela.

Siguiendo esta simple regla pueden conseguirse árboles que cubran bien cuadrados o bien rectángulos en los que las ramas no se tocan nunca entre sí pero pueden alcanzar cualquier punto del cuadrado/rectángulo.  Por ejemplo, para conseguir un árbol 2-D que cubra un cuadrado de 2x2, la rama más grande debe medir 1, sus dos ramas hijas también deben medir 1.  Las cuatro ramas nieta deben medir 1/2, las ocho biznietas, también 1/2, las dieciséis tataranietas 1/4... y así sucesivamente.

Si quitamos del fractal 2-D las ramas y dejamos solo los extremos de las ramas (que son puntos), estas constelaciones de puntos también llegan a cubrir todos los puntos del cuadrado o rectángulo.

Análogamente a lo que sucede con el árbol 2-D:

Para conseguir un árbol 3-D solo es necesario que cada rama biznieta sea de longitud mitad que la de su rama bisabuela

De esta forma el árbol 3-D podrá llegar a llenar un cubo, o bien un paralelepípedo recto de proporciones cualesquiera sin que sus ramas se corten entre sí.  Por ejemplo, para conseguir un cubo de 2x2x2, la rama más grande debe medir 1, sus dos ramas hija deben medir 1, sus cuatro ramas nieta también 1, sus ocho ramas biznietas deben medir 1/2, las dieciséis tataranietas 1/2, las treinta y dos tataratataranietas 1/2... y así sucesivamente.

Al contrario de lo que sucede con los árboles 2-D, aquí las ramas no pueden girar con respecto a su rama padre porque colisionarían con otras.

Análogamente a lo que sucede en el árbol 2-D, si quitamos del fractal 3-D las ramas y solo dejamos sus extremos (que son puntos), estas constelaciones de puntos también llegan a cubrir todos el espacio contenido en el cubo o paralelepípedo.

Todavía podemos dar una vuelta de tuerca:

Si convertimos cada conjunto de una rama padre con sus dos ramas hija (es decir, cada "H") del árbol 3-D en una porción de plano, cuadrada o rectangular, el conjunto de todos esos planos y planitos también alcanza a cubrir todo el espacio dentro del cubo o paralelepípedo. Y sí, como antes, los planos nunca se cruzan unos con otros:

 

 

Versión MSDOS:

Ahora la versión antigua (pero con características diferentes) del programa MSDOS para visualizar y girar el fractal:

Tenga en cuenta que la versión MSDOS puede no funcionar bien en equipos modernos.

Se incluye el .exe y las fuentes en QuickBasic 4.5. 

El código fuente ha sido compilado con el clónico de QuickBasic: "Power Basic 3.1" para aumentar la velocidad. 

Bájate el programa aquí: arbol209.zip (44 KB) descomprímelo, ejecútalo y pulsa la barra espaciadora para verlo en movimiento.

Esta es la pantalla de entrada al programa:

mft_screen.gif (8927 bytes)

arbol.exe main screen

Como puedes ver, cada rama tiene dos ramas hija, 4 ramas nieta... etc.

El árbol tiene varias propiedades interesantes:

  • No importa cuantas ramas se dibujen, una rama nunca se solapará con otra.
  • Si se dibuja un número infinito de ramas, éstas llenarán el plano sin cortar nunca unas a otras.
  • Todas las ramas pueden rotar simultánea y libremente sin tocarse jamás*, como puedes ver en los dibujos de abajo.  (El eje de rotación de cada una es su rama padre).

La única condición para que estas tres propiedades se cumplan es que la longitud de cada rama sea la mitad de la de su rama abuela.

* El programa tiene también una opción 3-D que dibuja un árbol que llena el espacio.  En 3-D, las ramas se cortan cuando rotan, así que no se podría construir un módelo móvil del mismo, aunque sí uno estático.  Sin embargo, todos los dibujos de abajo proceden del árbol 2-D, de éste que es posible construir un modelo, incluso un modelo móvil.

 

 

Un punto que gira alrededor de un eje

Para programar un árbol con rotaciones hace falta saber cómo girar un punto arbitrario en torno a un eje arbitrario del espacio en 3 dimensiones:

Sean (Ax , Ay , Az) and (Bx , By , Bz) dos puntos que definen un eje y (Px , Py , Pz) el punto que va a girar alrededor del eje.  P ’  es el punto P  tras haber girado "a" radianes alrededor del eje.

Sea n el vector unitario que apunta de A a B:

formula1.gif (2150 bytes)

Entonces (usando vectores 3D):

formula2.gif (2012 bytes)

Nótese que el punto y el aspa no son productos normales, sino productos escalar y vectorial respectivamente.
Nótese que el signo ± es debido a que P’ puede rotar en dos direcciones opuestas.

A partir de estas fórmulas se puede obtener el código MSDOS de la siguiente sección:

 

El Código

Éstas pocas líneas de código (en QuickBasic, PowerBasic or QBasic) bastan para crear, dibujar y ver el árbol rotando aleatoriamente:

REM Initialization
SCREEN 12
S = 10
WINDOW (-S, -S)-(S, S)
REM NIter is the number of iterations
NIter = 12
TPoints = 2 ^ NIter
Length = S / 2
Stp = TPoints / 4
K = 1 / SQR(2)
REM a(x, y)holds the coordinates of every branch tip
DIM a(TPoints, 2)

REM Calculate plain tree
FOR i = 1 TO NIter - 1
  FOR x = Stp TO TPoints STEP Stp * 4
    IF i MOD 2 = 0 THEN
      a(x, 0) = a(x + Stp, 0)
      a(x + 2 * Stp, 0) = a(x + Stp, 0)
      a(x, 1) = a(x + Stp, 1) - Length
      a(x + 2 * Stp, 1) = a(x + Stp, 1) + Length
    ELSE
      a(x, 0) = a(x + Stp, 0) - Length
      a(x + 2 * Stp, 0) = a(x + Stp, 0) + Length
      a(x, 1) = a(x + Stp, 1)
      a(x + 2 * Stp, 1) = a(x + Stp, 1)
    END IF
  NEXT x
  Stp = Stp / 2
  Length = Length * K
NEXT i

di:
CLS
REM Leave the program when pressing any key
IF INKEY$ <> "" THEN END
Stp = TPoints / 4

REM Draw tree
FOR i = 1 TO NIter - 1
  FOR x = Stp TO TPoints STEP Stp * 4
    x0 = a(x, 0)
    y0 = a(x, 1)
    P2 = 2 * Stp
    x1 = a(x + P2, 0)
    y1 = a(x + P2, 1)
    LINE (x0, y0)-(x1, y1)
  NEXT x
  Stp = Stp / 2
NEXT i

Stp = TPoints / 4
Pi = 3.14159
St = Pi / 128

REM Rotate Tree Randomly
FOR i = 1 TO NIter - 1
  Counter = 0
  FOR x = Stp TO TPoints - 1 STEP Stp * 2
    P2 = 2 * Stp
    Counter = Counter + 1
    Ax = a(x, 0)
    Ay = a(x, 1)
    Az = a(x, 2)
    IF Counter MOD 2 = 1 THEN
      Bx = a(x + P2, 0)
      By = a(x + P2, 1)
      Bz = a(x + P2, 2)
    ELSE
      Bx = a(x - P2, 0)
      By = a(x - P2, 1)
      Bz = a(x - P2, 2)
    END IF
    Mn = SQR((Bx - Ax) ^ 2 + (By - Ay) ^ 2 + (Bz - Az) ^ 2)
    nx = (Bx - Ax) / Mn
    ny = (By - Ay) / Mn
    nz = (Bz - Az) / Mn

    Alfa = INT(RND * 8) * St
    IF RND > .5 THEN Alfa = -Alfa
    ca = COS(Alfa)
    sa = SIN(Alfa)

    FOR j = x - Stp + 1 TO x + Stp - 1
      Px = a(j, 0) - Ax
      Py = a(j, 1) - Ay
      Pz = a(j, 2) - Az
      nPEscalar = nx * Px + ny * Py + nz * Pz
      nnPx = nPEscalar * nx
      nnPy = nPEscalar * ny
      nnPz = nPEscalar * nz
      cx = ca * (Px - nnPx)
      cy = ca * (Py - nnPy)
      cz = ca * (Pz - nnPz)

      snxPx = sa * (ny * Pz - nz * Py)
      snxPy = sa * (nz * Px - nx * Pz)
      snxPz = sa * (nx * Py - ny * Px)

      a(j, 0) = nnPx + cx + snxPx + Ax
      a(j, 1) = nnPy + cy + snxPy + Ay
      a(j, 2) = nnPz + cz + snxPz + Az
    NEXT j
  NEXT x
  Stp = Stp / 2
NEXT i

GOTO di


La salida a pantalla puede ser, tras unas pocas rotaciones aleatorias, como ésta:

arbol_random.gif (10109 bytes)

Árbol tras unas pocas rotaciones aleatorias

 

Salida Visual del Programa

Hay otros tipos de rotación que dan lugar a curiosas figuras.  Si se ejecuta el programa MSDOS (completo, no la porción de código que hay un poco más arriba) y se pulsa en el teclado numérico las teclas 4 y 6 ocho veces cada una, se consigue esta figura:

arbol_oposite.gif (5327 bytes)

Árbol tras rotaciones opuestas


Experimentando un poco más, se pueden obtener figuras como ésta:

arbol_oposite_2.gif (7138 bytes)

Las ramas no rotan a partir de la quinta iteración

 

En 1999/04/04 fue introducido el Número Áureo (ó Divina Proporción) = Phi = (sqr(5) + 1) / 2.   Si se multiplica el ángulo "Alfa" en el programa por Phi en cada iteración, se pueden obtener figuras curvas como la siguiente.  (Ésta en particular no puede dibujarse con la última versión del programa MSDOS "arbol209.zip" ni con el applet Java de arriba).

Multiplicando Alfa por Phi en cada iteración

 

Si deseas más información acerca de los Árboles Fractales Móviles, puedes leer el artículo: "A TUTORIAL AND RECIPE FOR MOVING FRACTAL TREES" en la revista Computers & Graphics, Vol 22, Número 2 - 3, pp. 301 - 305, 1998.

También puedes leer dos artículos previos sobre el tema, uno en "Carrollia"* (Número 53, pp. 10 - 12, Jun 1997). 

El otro fue publicado en la revista "Cacumen"** (Número 15, p. 38, Abr 1984)

* Carrollia es publicada por el Grupo de Intereses Especiales "Carrolsig", un grupo que trata sobre matemáticas recreativas dentro de Mensa España, y es editada por Josep Maria Albaigès.

** Cacumen fue una revista de Ingenio, Juegos y Humor que, desafortunadamente, dejó de publicarse en diciembre de 1986.


Si deseas hacer alguna pregunta o comentario sobre el tema, escríbeme: josechu2004@gmail.com

 

Libro de Visitas

 

Primera publicación: 1997
Último cambio: 2006-08-07