Triángulo de Sierpinski usando el Juego del Caos – Gráfico incorrecto (faltan puntos)
Estoy intentando generar un Triángulo de Sierpinski en Python utilizando el Juego del Caos.
Los cálculos de los puntos a plotear parecen correctos, sin embargo, en lugar de graficar miles de puntos, solo se grafican alrededor de 10.
import math
import numpy as np
import random as rand
import matplotlib.pyplot as plt
Definiendo los vértices
t = np.linspace(0, (2 * math.pi), 4)
v = np.array([[math.cos(t[0]), math.cos(t[1]), math.cos(t[2])],
[math.sin(t[0]), math.sin(t[1]), math.sin(t[2])]])
Definiendo el punto inicial
T = np.array([[0.5, 0], [0, 0.5]])
x = np.array([rand.random() - 0.5, rand.random() - 0.5]).reshape(2, 1)
res = np.zeros((2, 1))
n = 10000
for i in range(n):
for j in range(2):
k = rand.randint(0, 2)
res = np.expand_dims(res, axis=0)
res = np.multiply(T, np.subtract(x[j], v[:, k])) + v[:, k]
xx = [x for (x, y) in res]
yy = [y for (x, y) in res]
plt.plot(xx, yy, 'b.')
plt.show()
davy.ai
Posible explicación de por qué solo se representan algunos puntos en el triángulo de Sierpinski generado utilizando el juego del Caos:
Un posible problema en el código es que la variable ‘res’ no se reinicia adecuadamente a cero en cada iteración del bucle. En su lugar, se está expandiendo a lo largo del primer eje, lo que lleva a apilar múltiples filas de coordenadas una encima de la otra, causando que los puntos se solapen y reduzcan el número total de puntos visibles. Para solucionarlo, la línea
res = np.zeros((2, 1))
debe ser movida dentro del segundo bucle for, antes del cálculo dek
yres
. Esto asegurará que cada nueva iteración comience con una matriz vacía y limpia parares
.Otro problema es que el comando de representación
plt.plot(xx, yy, 'b.')
se llama dentro del segundo bucle for, lo que significa que para cada selección de vértice, se agrega un nuevo punto a la trama. Esto resulta en una imagen densa y ruidosa que oculta la estructura fractal del triángulo de Sierpinski. Para mejorar la claridad de la imagen, el comando de representación debe ser movido fuera del segundo bucle for, de modo que todos los puntos generados por el bucle se representen juntos después de completar las iteraciones. Una forma de hacerlo es almacenar las matricesxx
eyy
en listas separadas fuera del bucle, y luego pasarlas al comandoplt.plot()
después del bucle.Aquí hay una versión modificada del código que incorpora estos cambios:
Esto debería producir una imagen más clara del triángulo de Sierpinski con un mayor número de puntos representados. Tenga en cuenta que también se agrega el comando
plt.axis('equal')
para asegurar que las escalas de los ejes x e y sean iguales, manteniendo la forma de triángulo equilátero del fractal.