3.4 Przykłady w języku Python
3.4.1 Trójkąt Sierpińskiego raz jeszcze
Poniższy kod odtwarza konstrukcję trójkąta Sierpińskiego przedstawioną w tym rozdziale. W wektorze triangle definiujemy trzy wierzchołki trójkąta, a w obiekcie point umieszczamy współrzędne punktu startowego dla konstrukcji fraktala. Następnie w pętli przesuwamy punkt w kierunku losowego wierzchołka.
- \(x' = x/2\), \(y' = y/2\) (lewy róg)
- \(x' = x/2 + \frac 12\), \(y' = y/2\) (prawy róg)
- \(x' = x/2 + \frac 14\), \(y' = y/2 + \frac{\sqrt{3}}2\) (górny róg)
import numpy as np
import matplotlib.pyplot as plt
# Liczba kroków gry w chaos.
N = 200000
x_vec, y_vec, col_vec = [], [], []
# Współrzędne wierzchołków trójkąta.
triangle = [[0,0], [0.5, 2], [1.5,0.5]]
point = [0.1, 0]
# Losujemy numer wierzchołka, w kierunku którego przesuniemy punkt.
for i in range(N):
ind = np.random.choice(range(3))
point = np.multiply(np.add(point, triangle[ind]), 0.5)
x_vec.append(point[0])
y_vec.append(point[1])
col_vec.append(ind)
# Rysujemy wykres kropkowy z odwiedzonych punktów.
# Kolory odpowiadają wylosowanej transformacji.
plt.scatter(x_vec, y_vec, s=0.2, c = col_vec)
plt.axis('off')
plt.show()
3.4.2 Paproć Barnsleya
import numpy as np
import matplotlib.pyplot as plt
# Cztery transformacje składające się na paproć.
def trans1(x,y):
return (0., 0.16*y)
def trans2(x,y):
return (0.85*x + 0.04*y, -0.04*x + 0.85*y + 1.6)
def trans3(x,y):
return (0.2*x - 0.26*y, 0.23*x + 0.22*y + 0.8)
def trans4(x,y):
return (-0.15*x + 0.28*y, 0.26*x + 0.24*y + 0.44)
# Lista transformacji i wektor z prawdopodobieństwami wylosowania
# każdej z transformacji.
N, x, y = 200000, 0, 0
x_vec, y_vec, col_vec = [], [], []
trans = [trans1, trans2, trans3, trans4]
probs = [0.01, 0.79, 0.1, 0.1]
for i in range(N):
# Losujemy jedną z czterech transformacji.
ind = np.random.choice(range(len(trans)), p=probs)
selected = trans[ind]
x, y = selected(x,y)
x_vec.append(x)
y_vec.append(y)
col_vec.append(ind)
plt.scatter(y_vec, x_vec, s=0.2, c=col_vec)
plt.show()
3.4.3 Liść klonu
import numpy as np
import matplotlib.pyplot as plt
def transform(x,y, affine):
return(affine[0]*x + affine[1]*y + affine[2],
affine[3]*x + affine[4]*y + affine[5])
N, x, y = 200000, 0, 0
x_vec, y_vec, col_vec = [], [], []
# Lista transformacji.
affines = [[0.14, 0.01, -0.08, 0.0, 0.51, -1.31],
[0.43, 0.52, 1.49, -0.45, 0.5, -0.75],
[0.45, -0.49, -1.62, 0.47, 0.47, -0.74],
[0.49, 0.0, 0.02, 0.0, 0.51, 1.62]]
probs = [0.25, 0.25, 0.25, 0.25]
for i in range(N):
ind = np.random.choice(range(len(affines)), p=probs)
x, y = transform(x,y, affines[ind])
x_vec.append(x)
y_vec.append(y)
col_vec.append(ind)
plt.scatter(x_vec, y_vec, s=0.2, c=col_vec)
plt.show()
