|
|||||
Número 1 - JULIO 1992
< ATRACCION FRACTAL >
(c) Warlord. Marzo 1992 Dedicado a Benoit Mandelbrot 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 asequible, 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 aficionado 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:
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 librerías, 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. 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 incluiré 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í van!... 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 OL-Determinísticos) ¡Atención!, ESTO es un fractal: #define d 13 ¡¡Un momento!!, ¡que no 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. ATENCION:
Snowflake de Van Koch: w : Cuadrado En el primer paso, sustituimos las cuatro líneas rectas del cuadrado por p. Obtenemos: /\
_____/ \______
| | No está muy bien dibujado, pero si lo pintáis
| | 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: escribimos la semilla w
ab paso 1: sustituimos "a" por ab
abb paso 2: "" "" "" ""
abbb etc....
abbbb
(etc...)
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:
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:
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. 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. 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.
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 Antes hacíamos por ejemplo: w: F 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?
¿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
| | | |
---- ----
| |
| |
Línea ---- ----
original
derecha de la línea iniciadora (Por aquí estaría un fractal de
la forma Fr)
¿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 matemáticas ... Son muy utilizados en el diseño de fractales. Explicar de dónde salen y cómo son, 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 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 ...
TODO ESTO Y MUCHO MAS, EN FANZINE NUMERO 2. |
| Envía esta página web a un amigo: Esta opción está desactivada temporalmente, rogamos disculpen las molestias |
|