Draken-fractals

Draken-fractals

[oOO]

 

Hieronder lees je hoe je het programma uit het vorige nummer van Pythagoras kunt aanpassen om de figuren hieronder (en nog een paar meer te krijgen).

In het artikel De varen van Barnsley lees je welke wiskunde erachter zit.

import numpy as np
import matplotlib.pyplot as plt
# We definiëren de 2 transfomaties, de voorbeelden staan in het artikel zelf: 
# In deze code staan nu de transformaties voor de Lévy-draak
def f1(x, y):
    return 0.5*x + 0.5*y - 0.5, -0.5*x + 0.5*y
def f2(x, y):
    return 0.5*x - 0.5*y + 0.5, 0.5*x + 0.5*y

# hieronder de juiste transformaties invullen
fs = [f1, f2]

# We kiezen het startpunt
x, y = 0, 0
# We initialiseren nu twee rijen punten, _a voor de ene kleur, _b voor de andere
xs_a = [x]
xs_b = [x]
ys_a = [y]
ys_b = [y]
# We herhalen het proces een aantal keer
for i in range(500000):
    # waarbij we het lot laten beslissen welke 
    # transformatie we in elke stap toepassen
    f = np.random.choice(fs, p=[0.5, 0.5])
    x, y = f(x, y)
    # De punten komen nu willekeurig bij de ene of de andere kleur
    # let bij onderstaande if op dat je voor het laatste voorbeeld ook hier iets moet aanpassen
    if f == f1:
        xs_a.append(x)
        ys_a.append(y)
    else:
        xs_b.append(x)
        ys_b.append(y)
   
# We tekenen de punten, je kunt uiteraard zelf je eigen kleuren kiezen
plt.scatter(xs_a, ys_a, s=0.05, color='green', lw=0)
plt.scatter(xs_b, ys_b, s=0.05, color='red', lw=0)
plt.axis('equal')
plt.axis('off')
plt.show()
Figuur 1 - De Lévy-draak
Lévy-draak
def f1(x, y):
    return 0.5*x + 0.5*y - 0.5, -0.5*x + 0.5*y
def f2(x, y):
    return 0.5*x - 0.5*y + 0.5, 0.5*x + 0.5*y
Figuur 2 - Tweelingdraak
Tweelingdraak
def f1(x, y):
    return 0.5*x + 0.5*y - 0.5, -0.5*x + 0.5*y
def f3(x, y):
    return 0.5*x + 0.5*y, -0.5*x + 0.5*y

Dan zijn er ook nog twee andere:

def f1(x, y):
    return 0.5*x + 0.5*y - 0.5, -0.5*x + 0.5*y
def f4(x, y): 
    return -0.5*x + 0.5*y, -0.5*x - 0.5*y

en

def f5(x, y):
    return -0.5*x + 0.5*y - 0.5, -0.5*x - 0.5*y
def f6(x, y):
    return -0.5*x - 0.5*y + 0.5, 0.5*x - 0.5*y

Let op dat je bij deze laatste ook in het if-statement in de lus iets moet aanpassen.

Als je wilt weten of ze gelukt zijn, kun je bij [Bekijk oplossing] zien welk plaatje je zou moeten krijgen.

Bekijk oplossing