Created
February 15, 2016 12:05
-
-
Save joaoventura/c797aefb6188419ab908 to your computer and use it in GitHub Desktop.
Sierpinski Triangle (with the animations)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Creates the Sierpinski triangle using the Chaos Game technique. | |
Starts from a vertex of a triangle, chooses randomly the next vertex and | |
draw a pixel in the middle. Then, iteratively selects a new vertex and | |
draws in the middle point. | |
""" | |
import random | |
import matplotlib.pyplot as plt | |
from matplotlib import animation | |
def plot(points): | |
""" | |
Plots the points using matplotlib. | |
Points is a list of (x, y) pairs. | |
""" | |
xx = [x for (x, y) in points] | |
yy = [y for (x, y) in points] | |
plt.plot(xx, yy, 'g.') | |
plt.show() | |
def do_animation(points): | |
""" | |
Plots an animation of zooming using matplotlib. | |
Points is a list of (x, y) pairs. | |
""" | |
xx = [x for (x, y) in points] | |
yy = [y for (x, y) in points] | |
fig = plt.figure() | |
def init(): | |
ax = plt.axes(xlim=(0, 1), ylim=(0, 1)) | |
return ax.plot(xx, yy, 'g.') | |
def animate(i): | |
scale = 1 - i * 0.02 | |
ax = plt.axes(xlim=(0, scale), ylim=(0, scale)) | |
return ax.plot(xx, yy, 'g.') | |
anim = animation.FuncAnimation( | |
fig, animate, init_func=init, frames=50, interval=200, blit=False) | |
anim.save('sierpinski_10000.gif', writer='imagemagick') | |
plt.show() | |
def sierpinski(n, animate=False): | |
""" | |
Generates positions for the Chaos Game Sierpinski | |
triangle with 'n' iterations in a square of size 1x1. | |
""" | |
vertices = [(0.0, 0.0), (0.5, 1.0), (1.0, 0.0)] | |
points = [] | |
# initial vertex | |
x, y = random.choice(vertices) | |
for i in range(n): | |
# select new vertex | |
vx, vy = random.choice(vertices) | |
# get middle point | |
x = (vx + x) / 2.0 | |
y = (vy + y) / 2.0 | |
points.append((x, y)) | |
if animate: | |
do_animation(points) | |
else: | |
plot(points) | |
# Do the triangle with 10.000 points and no animations | |
sierpinski(n=10000, animate=False) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment