Zoom infinito-Triángulo de Sierpinski
¿En qué se basa la construcción?
- Para realizar la construcción, aprovecharemos que el triángulo de Sierpinski es autosemejante. Concretamente, al hacer homotecia de razón de semejanza 2 con centro en cualquiera de los tres vértices del triángulo exterior y recortar, se obtiene exactamente la misma figura.
- Como no podemos reproducir el proceso infinito de creación de la figura, se ha creado usando solo las primeras iteraciones; 7 en este caso.
- Pulsando el botón "Generar", podemos ver el proceso de creación y las primeras iteraciones. Fijémonos en que se basa en tener un conjunto de vértices sobre los cuales construiremos triángulos, todos iguales. En cada iteración, calculamos los nuevos vértices dividiendo a la mitad los lados de los triángulos que ya teníamos. La longitud de los lados de los nuevos triángulos también será la mitad.
- Una vez construidas esas primeras iteraciones del fractal, podemos ir aplicándole sucesivamente homotecias con centro en cualquiera de los extremos, aumentando la razón progresivamente hasta llegar a 2.
- En ese momento, volvemos a tener la figura inicial, con lo que podemos volver a la situación de partida, con razón de semejanza 1.
- Si hay suficientes vértices, el cambio no debería notarse, y podremos repetir el proceso.
Elementos de GeoGebra
- Necesitamos una lista, que denominaremos
verticesIteraciones
, con los vértices en los que situaremos los triángulos. - 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 denominaremosvelAnima
, y le hemos dado el valor1.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 la lista con 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.
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
(*) 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:vTriangulo1 = Vector(TrianguloA, TrianguloB)
vTriangulo2 = Vector(TrianguloA, TrianguloC)
- 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 listavertices0 = {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
Podríamos continuar así, hasta tener tantas iteraciones como queramos, hasta tener la lista finalvertices1 = {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))
...verticesIteraciones
, que es la que utilizaremos para crear el efecto zoom infinito.
Optimizando los recursos de GeoGebra (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.