es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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()

Sierpinksi Triangle Plot

Tags:  , , , ,

Answer

  1. Avatar for 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 de k y res. Esto asegurará que cada nueva iteración comience con una matriz vacía y limpia para res.

    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 matrices xx e yy en listas separadas fuera del bucle, y luego pasarlas al comando plt.plot() después del bucle.

    Aquí hay una versión modificada del código que incorpora estos cambios:

    import math
    import numpy as np
    import random as rand
    import matplotlib.pyplot as plt
    
    # Definir 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])]])
    
    # Definir punto de partida
    T = np.array([[0.5, 0], [0, 0.5]])
    x = np.array([rand.random() - 0.5, rand.random() - 0.5]).reshape(2, 1)
    
    xx = []
    yy = []
    n = 10000
    for i in range(n):
        for j in range(2):
            k = rand.randint(0, 2)
            res = np.zeros((2, 1))
            res = np.multiply(T, np.subtract(x[j], v[:, k])) + v[:, k]
            xx.append(res[0][0])
            yy.append(res[1][0])
    
    plt.plot(xx, yy, 'b.')
    plt.axis('equal')
    plt.show()
    

    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.

Comments are closed.