Sierpinksi Trojúhelníku pomocí Chaos Game - chyby přiřazení Nesprávné přípony Plot (chybějící body)

0

Otázka

Snažím se vytvářet Spierpinki Trojúhelník v Pythonu pomocí Chaos game. Výpočty bodů na pozemku zdát správné, nicméně, místo toho, aby tisíce bodů vykresleny, jen 10 nebo tak jsou vyneseny.

import math
import numpy as np
import random as rand
import matplotlib.pyplot as plt

# Defining vertices
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])]])

# Defining Starting point
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

chaos math matplotlib numpy
2021-11-22 17:20:38
1

Nejlepší odpověď

2

Za prvé, vítejte. Váš problém je dobře vysvětleno. Váš kód je soběstačný. Co skvělý první otázku.

Výpočty bodů na pozemku zdát správné.

Ne tak docela. Existuje několik problémů s váš kód. Některé jsou skutečné chyby, i snadné, aby se ty. Například, rand.randint(0,2) vám dává náhodné číslo v intervalu [0, 2). Všimněte si, že můžete nikdy dostat 2 tímto způsobem, a třetí vrchol je nikdy vybrány.

Mnohem větší problém je složitost kódu. Vnitřní smyčky přes j to nic nemění. Násobení matic odečíst 2 body jeden od druhého. Atd. To dostane tak složité, že jste si nikdy nevšimli, že x/res nikdy se dostane aktualizovány tak, že jste se spikli stejné body znovu a znovu. Ty by se měly snažit vyjádřit myšlenky jednodušší. Elegantní matematický zápis může být výchozí bod pro váš kód, ale to je zřídka sledované vlastnosti.

Tady je moje verze vašeho kódu, zjednodušené.

import numpy as np
import matplotlib.pyplot as plt

# Defining vertices
t = np.linspace(0, (2 * np.pi), 4)
v = np.array([[np.cos(t[0]), np.cos(t[1]), np.cos(t[2])],
              [np.sin(t[0]), np.sin(t[1]), np.sin(t[2])]])

# Defining Starting point
x = np.array([0., 0.])

# Loop
for k in np.random.randint(3, size=1000):
    x += 0.5 * (v[:, k] - x)
    plt.plot(x[0], x[1], 'b.')

plt.show()

enter image description here

2021-11-22 18:49:02

Děkuji moc za pomoc. Vaše vysvětlení a provádění jsou strait k věci, a snadno pochopitelné. :)
karlembeast

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................