English | Español 

LABORATORIO MATEMÁTICO

Los fractales son objetos matemáticos de gran complejidad, pero uno de sus múltiples atractivos es que se pueden dibujar de forma muy sencilla sin necesidad de grandes conocimientos matemáticos. En cambio sí es necesario conocer algún lenguaje de programación que facilite las cosas, ya que el método de dibujo requiere realizar infinidad de cálculos.

Este manual describe procedimientos sencillos que proporcionan buenos resultados, y está dirigido a los aficionados que quieran profundizar en el método de dibujo. Al no utilizar instrucciones de programación, también será útil para quien solo quiera obtener una visión general de cómo se dibuja un fractal.

 

CONTENIDO

  1. ¿Qué son los fractales?

  2. ¿Qué es una función matemática?

  3. ¿Qué hace falta para dibujarlos?

  4. ¡Vamos a dibujar!

  5. ¿Cuántos puntos tiene un plano?

  6. ¿Cómo explorar?

  7. ¿Cómo hacer zoom?

  8. ¿Como rotar el fractal?

  9. ¡Vamos a colorear!

  10. Un problema llamado aliasing...

  11. Más problemas: límites de procesamiento...

  12. Como curiosidad y para finalizar...

 

¿QUÉ SON LOS FRACTALES?

El término Fractal fue empleado por primera vez por el matemático Benoît Mandelbrot y deriva del adjetivo Fractus, que en latín significa fracturado.

El estudio de los fractales fue iniciado por Gaston Julia y posteriormente desarrollado por Benoît Mandelbrot, quien pudo comprobar con la ayuda de los primeros ordenadores los cálculos y deducciones realizados de forma manual por Gaston Julia. Hoy en día no existe una definición oficial que exprese eficientemente qué es un fractal, ya que todas las que se han propuesto dejan fuera algún objeto considerado como tal. En cambio, sí se han enumerado sus propiedades, por lo que podemos considerar fractal a un objeto que cumple varias de ellas:

  • Es un objeto de longitud y complejidad infinita dentro de un área finito.
  • Se genera mediante una función matemática sencilla.
  • Presenta auto semejanza en diferentes escalas.
  • Su dimensión es fraccionaria.

Comúnmente, en el lenguaje coloquial, se conoce como fractal a las imágenes obtenidas mediante la representación gráfica de una función matemática iterada.

 

¿QUÉ ES UNA FUNCIÓN ITERATIVA?

Es una expresión que permite calcular una variable dependiente del valor de otras, o del suyo propio en un proceso llamado iteración. Para empezar el proceso de iteración se debe conocer el valor inicial de la variable.

Vamos a iterar tres veces la función Zn+1 = Zn2 + C, fijando el valor inicial de Z como Z0

  • Primera iteración Z1 = Z02 + C
  • Segunda iteración Z2 = Z12 + C
  • Tercera iteración Z3 = Z22 + C

De esta forma se obtiene Z3 que corresponde al valor de Z después de tres iteraciones.

 

¿QUÉ HACE FALTA PARA DIBUJARLOS?

  1. Elegir una función:
    Utilizaremos la función Zn+1 = Zn2 + C, donde Z y C son números complejos.

  2. Operar con números complejos:
    Los números complejos constan de una parte real y otra imaginaria. Un número complejo se representa de forma binómica como Z = (a+bi). Donde "a" es el número real y "b" es un número imaginario múltiplo de la unidad imaginaria "i". La unidad imaginaria tiene como valor constante Raíz cuadrada de menos uno.

  3. Un plano de coordenadas:

    Eje de coordenadas cartesianas
    Coordenadas cartesianas

  4. Fijar condiciones de cálculo según la función elegida y el tipo de fractal que queremos obtener. Por ejemplo, si queremos dibujar el conjunto de Mandelbrot:

    • El valor inicial de Z será Z0 = (0+0i).
    • El valor de C corresponderá a las coordenadas de un punto del plano, siendo su componente real el valor de la coordenada X y su componente imaginario el valor de la coordenada Y. Entonces C = (X+Yi).
    • El número de iteraciones puede ser cualquier valor entero y positivo.
    • El radio de escape: se sabe que los puntos cuya distancia al origen de coordenadas es superior a 2 no pertenecen al conjunto, por tanto, lo fijamos en 2 y nos servirá para no realizar cálculos innecesarios.

 

¡VAMOS A DIBUJAR!

El proceso consiste en analizar cada punto del plano para averiguar si pertenece al conjunto o si se encuentra fuera de él. La regla a aplicar es que si logramos iterar la función el número de veces que hemos fijado sin que el valor absoluto de Z supere el radio de escape, el punto se encuentra dentro del conjunto, en caso contrario consideramos que el punto diverge quedando fuera del conjunto.

A modo de ejemplo vamos a analizar dos puntos con el número de iteraciones fijado en 2:

  • Primer punto C = (-2+2i)

    • Primera iteración: Z1 = (0+0i)2 + (-2+2i) = (-2+2i)
    • Comprobación: |Z1| = |(-2+2i )| = 2.828

    Como el valor absoluto de Z es mayor que el radio de escape sabemos que el punto se encuentra fuera del conjunto y no hace falta seguir iterando.

  • Segundo punto C = (-1+1i)

    • Primera iteración: Z1 = (0+0i)2 + (-1+1i) = (-1+1i)
    • Comprobación: |Z1| = |(-1+1i)| = 1.414
    • Segunda iteración: Z2 = (-1+1i)2 + (-1+1i) = (-1-1i)
    • Comprobación: |Z2| = |(-1-1i)| = 1.414

    Como hemos alcanzado la segunda iteración sabemos que el punto se encuentra dentro del conjunto y lo coloreamos.

Una vez realizado este proceso con todos los puntos del plano se obtiene la imagen que representa el fractal con dos iteraciones:

Mandelbrot con 2 iteraciones
2 iteraciones

Si realizamos el mismo proceso con mayor número de iteraciones obtenemos representaciones más definidas del fractal:

Mandelbrot con 4 iteraciones Mandelbrot con 8 iteraciones Mandelbrot con 16 iteraciones
4 iteraciones, 8 iteraciones y 16 iteraciones

 

¿CUÁNTOS PUNTOS TIENE UN PLANO?

El número de puntos es infinito... así que, como en definitiva vamos a colorear pixeles, analizaremos un único punto por cada pixel del lienzo de dibujo. Es conveniente establecer un sentido para recorrer el plano, como por ejemplo de izquierda a derecha y de arriba a abajo.

Imaginemos que el lienzo es una ventana que nos permite contemplar un área concreto del plano.
En este ejemplo el lienzo mide 100 x 100 px y el área del plano que nos permite ver tiene unas dimensiones absolutas de 4 x 4, dadas por el radio de escape:

X Mínima = -2
X Máxima = 2
Y Mínima = -2
Y Máxima = 2

Ancho Plano = X Máxima - X Mínima = 4
Alto Plano = Y Máxima - Y Mínima = 4

Para calcular qué punto del plano le corresponde a cada pixel, dividimos las dimensiones del plano con las del lienzo:

Incremento Horizontal = Ancho Plano / Ancho Lienzo = 4 / 100 = 0,04
Incremento Vertical = Alto Plano / Alto Lienzo = 4 / 100 = 0,04

Ahora, partiendo del punto inicial (-2+2i), que corresponde a la esquina superior izquierda, utilizamos los incrementos para saltar de un punto a otro mientras recorremos todos los pixeles del lienzo:

Tabla de correspondencia entre puntos y pixeles
Correspondencia de puntos con pixeles dentro del lienzo

 

¿CÓMO EXPLORAR?

En el ejemplo anterior tenemos el origen de coordenadas del plano centrado con el lienzo.
Para explorar el plano, solamente habrá que desplazar el origen de coordenadas, variando de esta forma el área del plano visible a través del lienzo.

Si por ejemplo centramos el punto del plano (-1,1i), una vez realicemos los cálculos, nuestra "ventana" mostrará el área del plano comprendido entre los puntos:

Superior izquierdo: (-3,3i)
Superior derecho: (1,3i)
Inferior izquierdo: (-3,-1i)
Inferior derecho: (1,-1i)

Resultado de explorar
16 iteraciones

 

¿CÓMO HACER ZOOM?

La técnica para adentrarse en el fractal consiste en disminuir las dimensiones del área del plano que queremos observar, de manera que al "estirarlo" para adaptarlo al lienzo se produce una ampliación que permite calcular nuevos puntos que antes estaban ocultos. De esta forma nos centramos en el área que queremos visualizar, y el resto lo ignoramos evitando hacer cálculos innecesarios.

Por ejemplo, manteniendo el tamaño del lienzo en 100 x 100 px vamos a fijar las coordenadas del plano que queremos visualizar en:

X Mínima = -1
X Máxima = 1
Y Mínima = -1
Y Máxima = 1

Ancho Plano = X Máxima - X Mínima = 2
Alto Plano = Y Máxima - Y Mínima = 2

Para calcular qué punto del plano le corresponde a cada pixel, dividimos las dimensiones del plano con las del lienzo:

Incremento Horizontal = Ancho Plano / Ancho Lienzo = 2 / 100 = 0,02
Incremento Vertical = Alto Plano / Alto Lienzo = 2 / 100 = 0,02

Ahora, partiendo del punto inicial (-1+1i), que corresponde a la esquina superior izquierda, utilizamos los incrementos para saltar de un punto a otro mientras recorremos todos los pixeles del lienzo:

Tabla de correspondencia entre puntos y pixeles para hacer zoom in
Correspondencia de puntos con pixeles dentro del lienzo

Una vez analizados todos los puntos obtendremos la siguiente imagen:

Resultado del zoom in
16 iteraciones

A medida que nos adentremos más y más en el fractal será necesario aumentar el número de iteraciones para poder visualizar zonas que aún no se han definido.

 

¿CÓMO ROTAR EL FRACTAL?

Para obtener una imagen girada del fractal hay que reemplazar cada punto original por el punto que ocuparía su posición después del giro. Imaginemos por ejemplo que queremos girar el fractal sobre el origen de coordenadas noventa grados hacia la derecha:

Tabla de correspondencia entre puntos y pixeles para rotación

Para calcular qué punto va a reemplazar cada punto original podemos utilizar la siguiente fórmula, donde Alfa es el ángulo en Pi radianes (-grados * Pi / 180):

Nueva X = X * Cos(Alfa) + Y * Sin(Alfa)
Nueva Y = -X * Sin(Alfa) + Y * Cos(Alfa)

Aplicando la fórmula al punto (-2+2i) con un giro de noventa grados tenemos:

Alfa = -90 * Pi / 180
Nueva X = -2 * Cos(Alfa) + 2 * Sin(Alfa) = -2
Nueva Y = -(-2) * Sin(Alfa) + 2 * Cos(Alfa) = -2

Como resultado obtenemos que el punto (-2+2i) es reemplazado por el punto (-2-2i).

Una vez reemplazados y analizados todos los puntos obtenemos la siguiente imagen:

Resultado de la rotación
16 iteraciones

Para girar el fractal alrededor de un punto diferente al centro de coordenadas podemos utilizar la siguiente fórmula, donde Alfa es el ángulo en Pi radianes y X0 e Y0 son las coordenadas del punto central del giro:

Nueva X = X0 + (X - X0) * Cos(Alfa) + (Y - Y0) * Sin(Alfa)
Nueva Y = Y0 - (X - X0) * Sin(Alfa) + (Y - Y0) * Cos(Alfa)

 

¡VAMOS A COLOREAR!

Necesitamos definir una paleta de colores y un método para asignárselos al fractal.
El método que utilizaremos será el algoritmo de tiempo de escape, que se basa en el número de iteraciones necesario para determinar si el punto pertenece o no al fractal. Para llevarlo a cabo, comprobamos el número de iteraciones que hemos alcanzado sin superar el radio de escape y a continuación, según este cómputo escogemos un color de la paleta.

Si definimos una correspondencia directa de iteraciones alcanzadas (tiempo de escape) con colores podremos iterar, como máximo, hasta el número total de colores que tenemos en la paleta. Para librarnos de este límite, calculamos el resto resultante de dividir el tiempo de escape entre el número total de colores, y de este valor nos quedamos su parte entera, ya que siempre estará acotada entre 0 y el número total de colores menos uno. Dicho valor será el que nos permita escoger el color.

Por ejemplo, si definimos la siguiente paleta, siempre que el tiempo de escape sea múltiplo de 4 el resto será cero, y por tanto el punto analizado será de color negro:

Tabla de colores para paleta de color
Paleta de cuatro colores

Resultado de la coloración
16 iteraciones

 

UN PROBLEMA LLAMADO ALIASING...

Es un fenómeno por el cual las líneas de una imagen digital se muestran escalonadas en lugar de continuas cuando la imagen tiene mayor resolución que el medio por el que se muestra.

Recordemos que para dibujar un fractal hay que recorrer y analizar todos los puntos del plano, pero como el número de puntos es infinito, decidimos analizar un único punto por cada pixel. Así es como forzamos la producción de Aliasing, ya que ocultamos bajo un único pixel infinitos puntos del fractal.

La forma de enmascarar el problema consiste en analizar un mayor número de puntos por cada pixel y finalmente colorear dicho pixel con el color medio de todos los puntos.
Imaginemos que a cada pixel se le aplica una rejilla de 4 x 4 elementos que lo divide en un recinto de 16 puntos. Los incrementos que antes utilizábamos para saltar de un punto a otro, en esta ocasión nos indicarán el primer punto del recinto. Por tanto nos hace falta calcular un nuevo par de incrementos para saltar de un punto a otro dentro del recinto:

Incremento Horizontal Recinto = Incremento Horizontal / Ancho Recinto = 0,04 / 4 = 0,01
Incremento Vertical Recinto = Incremento Vertical / Alto Recinto = 0,04 / 4 = 0,01

Ahora, partiendo del punto inicial del recinto, utilizamos los nuevos incrementos para saltar de un punto a otro dentro del mismo:

Tabla de correspondencia entre puntos y celdas de la rejilla para antialias
Correspondencia de puntos con celdas dentro de un pixel

Para colorear el pixel calculamos la media aritmética de todos los colores obtenidos del recinto.
Continuamos este proceso saltando de un recinto a otro mediante los antiguos incrementos vertical y horizontal hasta recorrer todos los pixeles del lienzo.

Resultado de aplicar antialias
16 iteraciones

En realidad esta solución calcula una imagen cuatro veces mayor, pero a su vez "encogida" mediante la media aritmética para representarla en el mismo espacio inicial. Por tanto, se obtendrá el mismo resultado si agrandamos el lienzo cuatro veces, calculamos el fractal analizando un único punto por pixel, y por último encogemos la imagen cuatro veces con ayuda de un programa de tratamiento digital de imágenes.

Como es lógico el tiempo de procesamiento se verá alargado, por lo que debemos elegir un tamaño de rejilla adecuado.

Antialias con rejilla 1x1 Antialias con rejilla 2x2 Antialias con rejilla 4x4 Antialias con rejilla 8x8
Exploración del conjunto de Mandelbrot con 1x1, 2x2, 4x4 y 8x8

 

MÁS PROBLEMAS: LÍMITES DE PROCESAMIENTO...

Cuando nos adentramos en el fractal, lo que hacemos es analizar un área del plano de menor tamaño que el anterior. Al realizar esta operación de forma continuada llega un momento en el que obtenemos valores tan pequeños que el procesador de nuestro ordenador no es capaz de manejarlos adecuadamente.

Concretamente cuando calculamos el incremento para saltar de un punto a otro obtenemos un valor tan pequeño que al sumárselo al punto actual para saltar al siguiente, la suma devuelve el mismo valor que teníamos.

En el siguiente ejemplo la coordenada X del punto queda constante:

Límite de procesamiento
Nueva X = X Anterior + Incremento Horizontal = X Anterior

En programación existen diferentes tipos de variables según la precisión que deseemos lograr, pero cuanto mayor es la precisión requerida mayor será también el trabajo realizado por el procesador. El punto a favor de utilizar variables de gran precisión es que lograremos desplazar el problema a puntos mucho más profundos del fractal, pero en contra tenemos que durante las primeras operaciones de zoom no necesitamos tanta precisión y el procesador estará realizando trabajo en vano que ralentizará muchísimo el proceso.

 

COMO CURIOSIDAD Y PARA FINALIZAR:

¿Qué tamaño tendría un fractal si en el proceso de zoom dibujásemos la imagen completa?

Para empezar, sabemos que el conjunto de Mandelbrot está contenido en un diámetro absoluto igual a 4, así que vamos a asignarle el centímetro como unidad de medida y vamos a dibujar una vista completa del fractal que mida cuatro centímetros de diámetro.

Imaginemos que la resolución de nuestra pantalla es de 96 px por pulgada. Como queremos dibujar una imagen de cuatro centímetros hay que calcular a cuantas pulgadas equivalen para luego calcular el ancho en pixeles que debe tener el lienzo:

  • 1 cm = 1 / 2,54 Pulgadas
  • 4 cm * 1 / 2,54 = 1,5748 Pulgadas
  • 1,5748 * 96 px = 151,18 Aproximadamente 151 px

Por tanto, con un lienzo de 151 x 151 px nuestra imagen impresa medirá aproximadamente 4 x 4 cm:

Mandelbrot de 4 cm con 256 iteraciones
256 iteraciones

Ahora imaginemos que realizamos zoom progresivamente hasta llegar a un área comprendido entre las coordenadas:

X Mínima = -0,654688557176857
X Máxima = -0,654688557176716
Y Mínima = 0,416061830169591
Y Máxima = 0,416061830169732

Mandelbrot de 7 ua con 51.200 iteraciones
51200 iteraciones

Llegado a ese punto estaremos visualizando en nuestra ventana de 151 x 151 px un área de:

Ancho = X Máxima - X Mínima = 0,000000000000141 cm
Alto = Y Máxima - Y Mínima = 0,000000000000141 cm

Aproximadamente el radio de un protón.

Con una simple regla de tres podremos calcular el diámetro aproximado que debería tener el fractal completo para poder visualizar el área seleccionado, tal cual lo estamos viendo:

Ancho visible --------------- 151 px
Ancho total ------------------- X px

0,000000000000141 cm -------- 151 px
4 cm -------------------------- X px

X = 4 * 151 / 0,000000000000141 = 4283687943262411,3475 px

A continuación pasemos la cifra obtenida en pixeles a unidades de longitud:

  • 4283687943262411,3475 px / 96 = 44621749408983,4515 Pulgadas
  • 44621749408983,4515 Pulgadas / (1 / 2,54) = 113339243498817,9669 cm
  • 113339243498817,9669 cm / 100000 = 1133392434,9881 Km
  • 1133392434,9881 Km / 149597870 = 7,5762 ua

Nuestro fractal completo mediría aproximadamente un diámetro de 7,5762 unidades astronómicas, que equivaldría a más de 814 veces el diámetro del Sol. Con variables de gran precisión se puede llegar a tamaños superiores a dos mil millones de años luz, equivalentes a más de veinte mil veces el diámetro de la Vía Láctea.


Agregar a favoritos | Subir al menú | Contactar

¿Qué ver después?
Si deseas experimentar quzás te interese conocer las funciones iterativas y las operaciones más frecuentes con números complejos.
Laboratorio matemático
Animación fractal
Fractfinder TV
Imagen fractal
Binary World 13
Binary World 13 (Mandelbox 2D - Sqrt)
Galería de Fract Finder
Citas célebres
« Los fractales reflejan la textura de la realidad »
Escritora Jeanne McDermott
Visitas
Ahora 2, durante hoy 304, en total 587.364
Sitio web seguro    Código HTML validado    Código CSS validado
Desarrollado con Notepad ;)