Las figuras con la cualidad fractal de ser autosemejantes nos ofrecen la oportunidad de hacer bonitas animaciones basadas en ellas con efecto de "zoom infinito". 

Por definición, cuando hacemos zoom para acercarnos a una zona de una figura autosemejante, el resultado "es" una figura "igual" a la original.

En este artículo, aprenderemos a aplicar un efecto zoom infinito con GeoGebra, basándonos en un fractal.

Este tipo de construcción podría servir como proyecto de aula para alumnos a partir de 4ºESO, en el que tendrán ocasión de poner en práctica sus conocimientos de

Para llevar a cabo este proyecto, será preciso tener unos conocimientos básicos de GeoGebra. Hay una pequeña parte de ampliación para la que es recomendable tener algunos conocimientos sobre guiones y scripts.

El resultado será similar al que mostramos a continuación. Nos basaremos en el triángulo de Sierpinski, por ser uno de los fractales más sencillos de generar con GeoGebra:

¿En qué se basa la construcción?

 

Construcción en GeoGebra

Elementos de GeoGebra

Los pasos para hacer una construcción con efecto zoom infinito basada en una figura autosemejante serán:

  • Generar una lista con las figuras. En este caso, los vértices en los que situaremos los triángulos, que denominaremos verticesIteraciones.
  • Mediremos el desarrollo de esta animación mediante un deslizador animación, entre 0 y 1, que medirá el porcentaje que llevamos desarrollado.
  • Podemos crear la animación combinando dos comandos, Homotecia y Poligonal, para unir los puntos. Para los triángulos, utilizaremos una poligonal en lugar de un polígono, para ahorrar el tiempo de computación de rellenar los triángulos. Considerar que para triángulos muy pequeños, la diferencia será mínima.
  • Utilizaremos el valor de la variable animacion para controlar el valor del factor de homotecia, que tendrá que ser entre 1 y 2.
  • Elegiremos como centro de la Homotecia, cualquiera de los tres posibles extremos, y lo denominamos PExtremo. Con algunas modificaciones, podemos centrar la homotecia en el punto medio de ambos extremos.
  • Usando un incremento lineal, 1+animacion, da la sensación de que la velocidad no es uniforme. Podemos modificarlo elevando la variable animacion a otro valor, que en este caso denominaremos velAnima, y le hemos dado el valor 1.3.
  • Para calcular la longitud de los lados del triángulo en cada iteración, consideramos que en cada paso se va dividiendo a la mitad, con lo que si los vértices iniciales son A, B y C, para la iteración número numIt podemos definir los vectores
vIteracion1 = 1 / 2^numIt Vector(A,B) vIteracion1 = 1 / 2^numIt Vector(A,C)

Uniendo todo lo anterior, ya sabemos que si tenemos la lista verticesIteraciones, con los vértices inferiores izquierdos de los triángulos, podemos definir la animación del triángulo de Sierpinski con esta secuencia:

triangulosIteracion = Homotecia(Zip(
            Poligonal({V, V + vIteracion1, V + vIteracion2, V}),
            V, verticesIteraciones), 1 + animacion^velAnima, PExtremo)

Construimos los vértices

Construir la lista de vértices puede parecernos un proceso complicado. Pero recurriendo a la definición del fractal no lo será tanto. Para ello:

  • Identificaremos cada triángulo con uno de sus vértices (así habrá que almacenar menos datos).
  • A partir de cada triángulo, definimos tres nuevos triángulos, cuyos lados miden la mitad del anterior y los vértices están situados en: Un vértice del triángulo inicial. Punto medio de cada uno de los lados que parten de ese vértice.

Podemos hacer que sea cualquier tipo de triángulo y que esté en cualquier posición (no es necesario que tenga una base paralela al eje de abscisas ni que sea equilátero). Guardaremos sus tres puntos en variables denominadas TrianguloA, TrianguloB y TrianguloC. Para poder dibujar y definir los nuevos triángulos, necesitaremos utilizar los lados y, más concretamente, los vectores correspondientes. Por eso los definimos como

vTriangulo1 = Vector(TrianguloA, TrianguloB)
vTriangulo2 = Vector(TrianguloA, TrianguloC)

(*) Utilizamos vectores en lugar únicamente longitudes, porque así nos indican la dirección en que tenemos que desplazarnos para calcular los demás vértices de cada triángulo. Definimos los elementos necesarios:

  • Partimos de un primer triángulo, que iremos dividiendo. Como solo utilizaremos un vértice de los triángulos, el elemento inicial será una lista con un único punto TrianguloA.
    Definimos la lista vertices0 = {TrianguloA}.
  • A partir de aquí, utilizaremos un proceso de inducción, que como sabemos, consiste en calcular el nuevo paso aplicando siempre las mismas normas al resultado del paso anterior. En este caso, calcular los nuevos triángulos tal y como se ha descrito antes.
  • Lo más cómodo es utilizar el comando Zip, que nos permite iterar sobre todos los elementos de una lista, ejecutando cierta acción sobre ellos (en este caso, obtener los nuevos vértices), y luego juntar todas estas pequeñas listas en una sola, utilizando el comando Encadena.
  • Así, obtendríamos las listas
    vertices1 = {TrianguloA, TrianguloA + 1 / 2 vTriangulo1, TrianguloA + 1 / 2 vTriangulo2}
    vertices2 = Encadena(Zip({V, V + 1 / 4 vTriangulo1, V + 1 / 4 vTriangulo2}, V, vertices1))
    vertices3 = Encadena(Zip({V, V + 1 / 8 vTriangulo1, V + 1 / 8 vTriangulo2}, V, vertices2))
    vertices4 = Encadena(Zip({V, V + 1 / 16 vTriangulo1, V + 1 / 16 vTriangulo2}, V, vertices3))
    ...
    Podríamos continuar así, hasta tener tantas iteraciones como queramos, hasta tener la lista final verticesIteraciones, que es la que utilizaremos para crear el efecto zoom infinito.
  • sierpinski 1 sierpinski 2
    sierpinski 3 sierpinski 5

Optimizando recursos (avanzado)

Si vamos a crear muchas iteraciones, especialmente si después queremos visualizar la construcción en la web, debemos tener en cuenta que estamos pidiendo a GeoGebra que haga cálculos con listas muy grandes, lo cual puede ocasionar que exija muchos recursos al ordenador, y la animación resulte poco fluida.

Para paliar esto, podemos recurrir a un pequeño truco, que consiste en conservar solamente la última lista, sobre la cual hay que operar para calcular la siguiente iteración. Además, guardaremos la lista como puntos libres de forma que, al no depender de ninguna condición, su cálculo y almacenamiento consume menos recursos del ordenador.

Para calcular la nueva iteración, bastará con calcular las nuevas longitudes de los lados y actualizar la lista con los nuevos vértices.

 

Longitudes de los lados

Bastará con dividir a la mitad las longitudes anteriores, lo cual se traduce en dividir los vectores iniciales por las correspondientes potencias de 2. Lo más cómodo es tener almacenados los resultados en forma de vector, que estarán definidos como

vIteracion1 = 1 / 2^numIt vTriangulo1 vIteracion2 = 1/2^numIt vTriangulo2

 

Lista de vértices

Podemos hacer la actualización mediante un botón, que al pulsarlo, genere los elementos necesarios. Así, bastaría con que el botón ejecutase únicamente dos instrucciones:

Valor(numIt,numIt+1) Valor(verticesIteraciones , Encadena(Zip({V, V + vIteracion1, V + vIteracion2}, V, verticesIteraciones)))

Pulsando repetidamente este botón, obtendremos las iteraciones deseadas. Conviene no usar un número elevado, para no sobrecargar la capacidad de procesamiento de listas de GeoGebra.

 

Por supuesto, este procedimiento puede utilizarse para aplicar el efecto zoom infinito a otros tipos de fractales. La construicción será similar, salvo la forma de construir el fractal.

Por ejemplo, podemos intentar reproducir este efecto de zoom infinito en el copo de nieve de Koch.

koch

 En este artículo del IGEx puedes encontrar los detalles sobre la construcción

 



¿Has realizado tu propia construcción con fractales y zoom infinito? ¡Compártela con nosotros! 


 

Esta entrada participa en la Edición 12.2: Carl Friedrich Gauss del
Carnaval de Matemáticas, que en esta ocasión organiza Gaussianos.