Volver menú revistas Fanzine
Número 1 - JULIO 1992
Página anterior


                                      /\
/ \
/¯¯¯¯\
/\/______\/\
/ \__/\__/ \

< ATRACCION FRACTAL >


CAPITULO I: SISTEMAS DE LINDENMAYER

(c) Warlord. Marzo 1992

Dedicado a Benoit Mandelbrot
Profesor de Matemáticas de la Universidad de Hardvard
(Por ser el primero en esto)

IMPORTANTE: Antes de leer este artículo, lee el de introducción a los fractales, así te enterarás de qué son o para qué sirven.

Si hace unos meses, alguien hubiese escrito un curso sobre este tema, estar seguros que me habría dado, cuanto menos, con un canto entre los dientes, y la explicación es fácil: Este curso es único en su género. Hacer un curso sobre un lenguaje u otra cosa, es más o menos adsequible, pues se puede encontrar documentación sobre el tema y un esquema claro que seguir. Pero en el caso de los fractales, esto no ocurre. Nunca he escuchado que una revista o publicación, incluso entre las más serias, haga siquiera un artículo sobre cómo construir fractales, a lo más, comentar algún programa de paisajes o cosas por el estilo.

Espero que comprendáis, lo difícil que es esto. Uno no sabe por dónde empezar,o de que hablar. Al final me he decidido por empezar por lo más fácil

Quiero advertiros, que soy un simple aficcionado al tema, y ni mucho menos soy un experto, pues entre otras cosas, estoy aprendiendo ahora. Si alguno de los que lean esto, conocen algo sobre fractales, espero que me escriban inmediatamente, ¡ya!, ¡¡ya!!.

NOTA ENCANTA: La dirección postal ha sido omitida por ser datos desfasados.

* Libros DIVULGATIVOS (sólo superficiales) de fractales,publicados en España:

- Caos, por David o Zelnick. Editorial ???. Precio: Unas 2500 pts
- El mundo fractal. B. Mandelbrot, Ed. Tusquetes. Precio: Unas 1500 pts.
- Varios más que no recuerdo...

Si queréis comprar alguno, quizás el segundo sea mejor. Pero no olvides que sólo son superficiales.

* Libros SERIOS de fractales, publicados en Español:

NINGUNO

* Libros SERIOS en Inglés que puedes buscar en España:

Con algo de suerte, no es difícil encontrar el libro:

FRACTAL PROGRAMING IN C

así como su edición avanzada. Con mucha suerte, y sólo en grandes librerias, podréis encontrar alguno más.

La única forma de comprar algún otro, es escribir directamente a alguna editorial. Concretamente, la Springer-Verlag dispone de excelentes libros sobre esto. Su dirección es:

Springer - Verlag N.Y.
175 Fifth Avenue
New York, NY 10010
U.S.A.

El precio de estos libros varía entre 7000 y 15.000 pts

También la editorial Academic Press tiene muy buenos libros, aunque de un nivel muy elevado. Para aquellos con buenos conocimientos de Matemáticas (entiéndase de Topología y funciones complejas, el mejor es "Fractals everywhere", de esta última editorial.

Por último os advertiré que al final de cada artículo incluire algunas nociones de matemáticas fundamentales para este cursillo. Intentaré ir incluyendo las rutinas en C, de forma que sean rutinas fáciles de entender y de adaptar, ya sea a ensamblador o a un lenguaje de alto nivel.

Y sin más preámbulos .... ¡Ahí ván!...


SISTEMAS DE LINDENMAYER (L- SYSTEMS):

Fueron desarrollados por Aristid Lindermayer, para la representación de la estructura de las plantas. Bajo el nombre de L-sistemas, se esconden numerosas representaciones de los fractales, más o menos complejas. Comenzaremos con el más importante, y a partir del cual se derivan los demás


SISTEMAS DOL:

(Sistemas OL-Determinísticos)

¡Atención!, ESTO es un fractal:

  #define d 13
#define e 3
#define m 2
#define n 3
#define u 1
#define v 1
w : S(0)a(1,0) p1 : a(t,c):t<m ----->a(t+1,c) p2 : a(t,c):(t=m)&(c<e) ----->I(0,u)[L]a(1,c+1) p3 : a(t,c):(t=m)&(c=e) ----->I(0,u)[L][b(1)]a(1,c) p4 : b(t) :t<n ----->b(t+1) p5 : b(t) :t=n ----->I(0,v)[L]b(1) p6 : S(t) :* ----->S(t+1) p7 : S(t) < I(i,j):t=d ----->I(i,j) p8 : I(i,j):(0<i)&(i<j) ----->I(i+1,j) p9 : I(i,j)<I(k,l):(i=j)&(k=0) ----->I(1,l) p10: I(i,j)<a(k,l):i>0 ----->I[L][b(1)]B p11: I(i,j)<b(k) :i>0 ----->I[L]B p12: B :* ----->I[K]B END.

¡¡Un momento!!, ¡que nó cunda el pánico! .... ¡volved!. Esto no es necesario que lo comprendáis (¡aún!), pero... ¿a que a sido un buen pegote?

Para los "viejos carrozas informáticos", en cuanto os diga de qué va esto, enseguida recordaréis un lenguaje, tan querido como olvidadado : ¡EL LOGO!. ¡Un momento!, ¡esto no significa que haya que saber Logo o que vaya a hacer otro de mis cursos-rollos! (pero no creáis que no me gustaría ... Je,je,je).

El Logo es ya un lenguaje que pasó a la historia hace ya muchos años, y que hoy en día no tiene ninguna utilidad.

Ahora, para comenzar de una forma bonita y divertida, dibujemos un fractal.
Es el llamado "snowflake" de Von Koch (1905)

ATENCION:

- Un fractal comienza siempre con una semilla o iniciador, denotada por w.

- A continuación, van una serie de pasos, denotados por p1, p2.... Se aplican uno detrás de otro. Una vez acabados, le fractal ha sido dibujado.

- Si el paso, es siempre el mismo, se denota por "p" y se llama "generador". La orden dada por el paso "p" se aplica un cierto número de veces (los que uno quiera). Generalmente 4 ó 5. Teóricamente se pueden aplicar infinitas veces, en la práctica, como por ejemplo, a la hora de hacer una demo, la limitada resolución de nuestra pantalla no nos permite mucho más allà de 3 pasos o iteraciones.

- a-->b significa que donde halla "a", quitarla y poner "b"

Snowflake de Van Koch:

 w : Cuadrado
p : linea -------> linea+triangulo+linea (ed, sustituir línea por figura p) w: Dibujamos un cuadrado
_________________
w= | |
| | p= /\
| | ________/ \________
| |
| |
| |
|_________________| INICIADOR GENERADOR

En el primer paso, sustituimos las cuatro lineas rectas del cuadrado por p. Obtenemos:

            /\
      _____/  \______
     |               |       No está muy bien dibujado, pero si lo pintais
     |               |       bien, podréis verlo mucho mejor.Obtenemos una
    /                 \      especie de estrella con 16 líneas rectas (con-
   /                   \     tar todas las líneas,4 por lado:
   \                   /           1     2/\3
    \                 /         _________/  \_______4
     |               |
     |_____    ______|
           \  /
            \/

En cada una de estas 16 líneas metemos la figura p de nuevo. Si lo hacéis 4 o más veces, obtendréis un maravilloso fractal.

Si habéis leido el artículo de introducción os preguntaréis, ¿y que pasa con el rollo de la dimensión fraccional?. Sabed, que si esto se hace un número infinito de veces, las figuras "cambian de dimensión" (mas o menos).

Otro ejemplo menos geométrico:

  w: a
  p: a ----> ab
     Resultado:
        a        paso 0: escibimos la semilla w
        ab       paso 1: sustituimos "a" por ab
        abb      paso 2:   ""         ""  ""  ""
        abbb     etc....
        abbbb
        (etc...)


Una vieja amiga: La tortuga

Para los que no lo sepan, la tortuga era un triángulo que desplazábamos por la pantalla en el lenguaje Logo, para dibujar. Se guiaba con órdenes del siguiente tipo:

adelante y dibuja 10 (la "tortuga" se movia 10 pixels para delante, dibujan do una línea)
girar derecha 90 (la tortuga giraba 90 grados a la derecha)
atrás y no dibujar 3 (se mueve hacia atrás 3 pixels pero no dibuja nada)

etc...

la tortuga, venía pues definida por 3 variables: (x,y,a).

  x = Posición horizontal en pantalla.
  y = Posición vertical en pantalla.
  a = ángulo de la nariz de la tortuga.

De ahora en adelante, utilizaremos una tortuga (eso sí, muy rápida).... bueno, utilizaremos una Turbo-tortuga para que dibuje nuestros fractales. Los comandos básicos (por el momento), serán:

F  

Mover adelante d posiciones y dibujar una línea. Ahora, la nueva posición de la tortuga es:

x' = x+d*cos(a)
y' = y+d*sen(a)

el ángulo no varía

f Igual que la anterior, pero sin dibujar línea.
+ Girar un ángulo "s" a la izqda de a grados. La posición no varía pero el ángulo sí:

a' = a+s

- Igual pero a la izqda: a' = a-s

Nota: los valores de "d" y "s" se definen al principio del programa.

Veamos otro Fractal:

 w: F - F - F - F -
 p: F ----> F - F + F + F F - F - F + F

el paso será d=1 y el ángulo s=90 grados.

¿Qué es w?:

En principio, suponemos que la nariz de la tortuga apunta hacia arriba.
w: Mover 1 adelante.Girar izqda 90 grados. Pintar linea. Girar otra vez. Pintar línea, girar pintar y girar...... ¡un cuadrado!:

   Tortuga en el paso 0:    /\
   F ......                 /|\
                             |
                             | .... posición anterior
   - ......                  >
                             |
                             |
                             |
   F .....                   ----->
                            |
                            |
                            |
   etc....

Para ver lo que es p, lo mejor es pintarlo en una gran hoja de papel. Recordad que ahora debéis sustituir los 4 lados del cuadrado por p. El resultado es el llamado "isla cuadrática de Koch". Este fractal ha sido utilizado en varias demos, como por ejemplo "Alpha-Omega" de los PMC (¡Hey Vanguard!, no estaba nada mal!)

Otro ejemplo:

  d=1, s=90 grados. Aplicar p 4 veces
  w: - F
  p: F --> F + F - F - F + F

Ya que estamos con las demos, y para acabar con esta parte, el siguiente fractal es otro de los más utilizados en dichas demos:

 # define s=90  /*ie, el ángulo vale 90 grados*/
 # define p=1   /* el paso vale 1
 # define n=4 /* de ahora en adelante, n será el número de veces que hay
                 que repetir p */
 w: F - F - F - F
 p: F ---> F F - F - - F - F

Nota: Estos Fractales son los más sencillos que uno puede encontrar. No esperéis que resulten tan espectaculares como por ejemplo el conocido plasma de la Hardwired. Estos Fractales son mucho más complejos y serán explicados bastante más adelante.


Sistemas DOL: Edge & node rewriting

Siguiendo con los sistemas DOL, vamos a ver otras maneras de crear fractales muy similar a la anterior. Son los sistemas Node rewriting & Edge rewriting. Me he permitido la libertad de dejar sus denominaciones en Inglés, pues no hay una palabra en Español que los defina bien. Su traducción viene a ser algo así como Reescritura de ejes (Edge) y vértices (Nodes).

Como decía, es muy parecido al anterior, sólo que en esta ocasión podemos controlar más o menos (mas bien menos), el movimiento del fractal.

Edge Rewriting:

Dan lugar a las curvas FASS (su traducción es irrelevante). La misión de estas curvas, es rellenar lo más posible todo el espacio, pero sin cruzarse.

Es igual a las anteriores, sólo que en esta ocasión el movimiento hacia delante de la tortuga, se ha diferenciado en dos. Es decir, ahora en lugar de "F", encontrarás "Fr" y "Fl" (del Inglés Forward-Right & Forward-Left). ¡Pero ojo!, NO SON DISTINTOS. SON EL MISMO MOVIMIENTO ....

... y se preguntarán... si son el mismo, ¿porqué llamarles de forma distinta?.

Veamos. Supongamos que tenemos una línea formada por 4 movimientos hacia delante de la tortuga:

                         1        2           3          4
F F F F .... --------->---------->----------->---------->

Antes hacíamos por ejemplo:

 w: F F F F
p: F----> F + F -

El problema, es que hemos modificado cada F de la línea iniciadora (w) por otro movimiento, que ha actuado POR IGUAL sobre las cuatro partes de la línea. ¿Qué ocurre si sólo deseamos que actúe sobre las dos primeras partes?, o mejor, ¿y si queremos que sobre 1 y 3 actúe de forma contraria a la que actúa sobre 2 y 4?.

A la hora de rellenar espacios vacíos con las curvas FASS, es importante rellenar espacios a derecha e izqda de la línea iniciadora. Veamos un ejemplo:

 #define p=1
 #define s=60  /* 60 grados*/
 #define n=4 /* repetimos 4 veces el proceso */
 w : Fl
 p : Fl ---> Fl+Fr++Fr-Fl--FlFl-Fr+
     Fr ---> -Fl+FrFr++Fr+Fl--Fl-Fr

(Curva Hexagonal de Gosper)

¿Cómo actúa este Fractal?

w:  

Dibujamos una línea hacia delante. Al denotarla por Fl significará que el fractal que la sustituya debe moverse hacia si izqda:

                izqda de la linea
       --------------------------            
          derecha de la línea
p: Sustituimos esta línea por otra, que si la representáis veréis que en efecto, se mueve hacia su izqda. Posteriormente, todas las líneas que aparecen como Fr las sustituimos por un nuevo dibujo, que se mueve hacia la derecha, y así sucesivamente ...

¿Cómo?, ¿que no os habéis enterado?. Vale, repetimos:

Dibujamos una línea que llamaremos (Fl). A partir de ahora, donde aparezca Fl, sustituiremos el primer mogollón, y donde aparezca Fr, el segundo. ¿cómo que donde aparece Fr?, aparecerá al sustituir Fl por Fl+Fr++Fr... la primera vez. Espero que ya esté más claro ...

Desde luego, para moverse hacia la izqda o la derecha, podemos construir cientos de dibujos, más o menos complicados.

Para acabar, éste es un ejemplo de movimiento a la izqda:

     Fl ---> FlFl+Fr+Fr-Fl-Fl+Fr+FrFl-Fr-FlFlFr+Fl-Fr-FlFl-Fr+FlFr+Fr
             +Fl-Fl-FrFr+

Así, si hacemos:

    w: Fl
    p: Fl ---> FlFl+Fr+Fr-Fl-Fl+Fr+FrFl-Fr-FlFlFr+Fl-Fr-FlFl-Fr+FlFr+Fr
             +Fl-Fl-FrFr+
       Fr ---> bla, bla...

En la primera iteración, al sustituir Fl, obtendremos:

                            ----
                           |    |
                           |    |
             ---- ---- ----     
            |                   |
            |                   |
             ---- ----      ----
                      |    |
                      |    |
                  ----           ----          Izqda de la línea
                 |         |    |    |         iniciadora
                 |         |    |    |        
                  ----      ----
                      |              |
                      |              |     
 Linea       ---- ----
 original
             derecha de la línea iniciadora (Por aquí estaría un fractal de
                                             la forma Fr)   


SEGUIREMOS INFORMANDO ...

¿Os ha gustado?, ¡Espero que sí!. Si os gusta, pero no lo acabáis de entender, escribirme, intentaré responder a todos. Veamos algo ahora de matamáticas ...


NUMEROS COMPLEJOS:

Son muy utilizados en el diseño de fractales. Explicar de dónde salen y cómo són, me parece algo aburrido, así que iré directamente al grano:

Supongamos que tenemos dos puntos en la pantalla de nuestro querido Amiga, que tienen por coordenadas (a,b) y (c,d). ¿Cómo operar con ellos?, ¿cómo multiplicarlos....?. Necesitamos otra representación y esta viene a través de los números complejos.

Así pues, un punto de coordenadas (x,y) lo representaremos por x + y!.

 x = PARTE REAL
y = PARTE IMAGINARIA

Podemos ahora operar con ellos:

SUMA:

  (x + yi) + (a + bi) = (x+a + (y+b)i )

RESTA:

igual pero todo con menos

MULTIPLICACION:

 (a+bi)*(c+di) = (a*c - b*d)+(b*c + a*d)i

La división no es necesaria para nuestros fines.

En C sería ...

  struct complex
 {
    float real,
          imaginario;
 }
 ....
 /* Veamos como multiplicar dos números complejos*/
  struct complex multiplicar(struct complex a,struct complex b)
 {
     struct complex c;
     c.real=a.real*b.real-a.imaginario*b.imaginario;
     c.imaginario=a.imaginario*b.real+a.real*b.imaginario;
     return c;
  }

Y EN NUESTRO PROXIMO NUMERO ...

  • más sobre Sistemas DOL:Node rewriting
  • Fractales ¡TRIDIMENSIONALES!
  • Estructuras en árbol
  • Operaciones con matrices

TODO ESTO Y MUCHO MAS, EN FANZINE NUMERO 2.


Página anterior