Una playa en fractales — Matplotlib

Alejandro Nadal
5 min readJan 14, 2021

--

Los fractales son elementos interesantes, estudiados en diversas ciencias. Figuras que se autoreplican, siendo iguales sin importar desde cuan cerca o lejos las veamos. La gran mayoría tiene propiedades matemáticas importantes a tener en cuenta y son una herramienta útil para el estudio del mundo.

Copo de nieve de Koch. Fuente: Wikipedia

Ahora bien, ¿Qué tienen que ver los fractales y las playas? En este articulo, vamos a intentar crear una playa a partir de fractales.

Hay numerosos fractales que serian probablemente mucho mejores para lo que estamos por intentar. Sin embargo, hoy vamos a preferir la simpleza a la complejidad, tomando uno de los fractales mas simples y mas antiguos que conocemos. El Conjunto de Cantor.

El Conjunto de Cantor se crea mediante el siguiente algoritmo. Imaginemos una linea extendida, que va desde 0 a 1.

Segmento AB

Dividamos este segmento, en tres partes de igual longitud

Segmentos AC, CD, y DB

Y eliminemos ahora, el segmento del medio

Segmentos AC y DB

Ahora, replicamos estos pasos para los segmentos AC y DB. Como esto se torna tedioso para seguir haciéndolo en Geogebra, recurro a Python para continuar.

Importamos algunas librerías esenciales.

Aquí generamos los valores del conjunto. Esencialmente, vamos formando conjuntos a partir de cada uno previamente existente. La magia esta en las lineas 10 y 11, donde se puede ver como cada segmento nos devuelve dos.

Primeras 3 iteraciones del conjunto de cantor.

Una vez tenemos estos valores, podemos recurrir a Matplotlib para graficar el Conjunto de Cantor.

Como resultado, obtenemos estos graficos. Prestemos atencion a como decrece la longitud de los segmentos y como se distribuyen en el espacio existente.

Conjunto de Cantor — Gráfico

Un buen libro matemático empezaría a describir todas las propiedades de este conjunto. Sin embargo, acá vamos a inclinarnos por utilizar este fractal, intentando modelar algo que encontremos en la vida real. En concreto, una costa, vista desde arriba (supongamos, una imagen satelital).

Egipto y el Mar Mediterraneo.

Lo primero que necesitamos, es dar alturas a nuestras lineas. Podemos ver patrones irregulares que necesitamos replicar. Para ello, introduzcamos altura en nuestro conjunto de Cantor, mediante una distribución normal. La función utilizada es normalvariate, del paquete random, la cual requiere de una media y una variancia.

Esto nos da como resultado, algo aún bastante lejano al objetivo que andamos buscando.

Lineas de Cantor con alturas aleatorias — Fuente: elaboración propia

Vamos a trazar lineas entre estos puntos con el objetivo de formar la costa. Para ello, voy a usar el elemento Polygon de Matplotlib. Como su nombre dice, nos permite dibujar distintos tipos de polígonos y poligonales.

Para usarla, necesitaremos transformar nuestra lista de listas de puntos, en una lista de tuplas. ¿Por qué? ¿A quien en su sano juicio se le hubiera ocurrido que fuera necesario usar tuplas?

No lo se. Todo lo demás en Matplotlib es feliz recibiendo arreglos de numpy. Pero la documentación lo exige, y no es complejo, así que acatamos.

Tomó la tercera iteración del Conjunto de Cantor. La razón es puramente estética. Mientras mas profundo vayamos en las iteraciones del conjunto de cantor, mas pequeños serán los detalles. Si nos quedamos con la primera o segunda iteración, tendremos puntos muy separados aun. Si planeas poner en practica esta técnica, jugá con los valores hasta que obtengas los resultados deseados.

Finalmente, graficámos el polígono. Uso un gráfico común, con un fondo celeste. Puse un borde rojo para que se note con claridad como se formo la linea costera. Los puntos del Conjunto de Cantor se convierten en vértices de la misma.

Linea costera de una playa, vista desde arriba

Aquí el resultado final, sin la linea roja en el borde.

Linea costera en una playa, generada artificialmente mediante el Conjunto de Cantor. Fuente: elaboración propia

¿No hay métodos que dan mejores resultados?

Por supuesto

Para dar un ejemplo, pensemos en un videojuego, en el cual vemos a nuestro personaje o región desde una cámara vertical.

Costa en un videojuego. Fuente: inkarnate.com

Una opción es dibujar el mapa y renderizarlo en el videojuego. Esta es la mejor solución, la que producirá mejores resultados, siempre y cuando no sea problemático que tengamos siempre la misma costa.

Por otro lado, si necesitamos muchísimas imágenes de costas en nuestro juego, quizás resulte mas conveniente, desde un punto de vista económico y de espacio en disco, autogenerar las costas con un algoritmo. De esta manera, con algunas lineas de código, obtenemos un resultado creíble y utilizable.

Existen técnicas que devolverán resultados mucho mas precisos que utilizar el Conjunto de Cantor. Por ej., utilizando la Curva de Koch, el fractal que mostré al principio del articulo.

Costas generadas por la curva de Koch. Fuente: [1]

Espero que haya sido útil. Déjenme sus dudas, correcciones, sugerencias o comentarios. Un saludo a todos!

Alejandro Nadal

Referencias

[1] Ji, S., Zhang, Z., Yang, H. et al. Application of fractal algorithms of coastline echo’s generation on marine radar simulator. Vis. in Eng. 4, 8 (2016). https://doi.org/10.1186/s40327-016-0037-7

--

--

Alejandro Nadal

Software Engineer. FOSS Advocate. An Argentinian living in Switzerland, attempting to write a few words.