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.

  1. \(x' = x/2\), \(y' = y/2\) (lewy róg)
  2. \(x' = x/2 + \frac 12\), \(y' = y/2\) (prawy róg)
  3. \(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()

3.4.4 Spirala

Transformacje tworzące spiralę.

affines = [[0.7878, -0.4242, 1.7586, 0.2424, 0.8598,1.408],
  [-0.1212, 0.2575, -6.7216, 0.1515, 0.05303, 1.3772],
  [0.1818, -0.1363, 6.0861, 0.0909, 0.1818, 1.5680]]
probs = [0.9, 0.05, 0.05]