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.
= 200000
N = [], [], []
x_vec, y_vec, col_vec # Współrzędne wierzchołków trójkąta.
= [[0,0], [0.5, 2], [1.5,0.5]]
triangle = [0.1, 0]
point
# Losujemy numer wierzchołka, w kierunku którego przesuniemy punkt.
for i in range(N):
= np.random.choice(range(3))
ind = np.multiply(np.add(point, triangle[ind]), 0.5)
point 0])
x_vec.append(point[1])
y_vec.append(point[
col_vec.append(ind)
# Rysujemy wykres kropkowy z odwiedzonych punktów.
# Kolory odpowiadają wylosowanej transformacji.
=0.2, c = col_vec)
plt.scatter(x_vec, y_vec, s'off')
plt.axis( 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.
= 200000, 0, 0
N, x, y = [], [], []
x_vec, y_vec, col_vec = [trans1, trans2, trans3, trans4]
trans = [0.01, 0.79, 0.1, 0.1]
probs
for i in range(N):
# Losujemy jedną z czterech transformacji.
= np.random.choice(range(len(trans)), p=probs)
ind = trans[ind]
selected = selected(x,y)
x, y
x_vec.append(x)
y_vec.append(y)
col_vec.append(ind)
=0.2, c=col_vec)
plt.scatter(y_vec, x_vec, s 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],
3]*x + affine[4]*y + affine[5])
affine[
= 200000, 0, 0
N, x, y = [], [], []
x_vec, y_vec, col_vec # Lista transformacji.
= [[0.14, 0.01, -0.08, 0.0, 0.51, -1.31],
affines 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]]
[= [0.25, 0.25, 0.25, 0.25]
probs
for i in range(N):
= np.random.choice(range(len(affines)), p=probs)
ind = transform(x,y, affines[ind])
x, y
x_vec.append(x)
y_vec.append(y)
col_vec.append(ind)
=0.2, c=col_vec)
plt.scatter(x_vec, y_vec, s plt.show()