Recently I was going through some old code that I had lying around, and found this little piece. I had been procrastinating on wikipedia one day and found the article on Chaos Games. At the bottom there's a link to a page with an applet to generate the fractals. Of course I had to have a go, and managed to whip together this:
from PIL import Image, ImageDraw
import random
size = (300,300)
im = Image.new('RGB', size)
draw = ImageDraw.Draw(im)
x, y = random.random(), random.random()
for i in xrange(50000):
rand = random.random()
if rand < 0.01:
x, y = 0.0, 0.16 * y;
elif rand < 0.86:
newx = (0.85 * x) + (0.04 * y)
newy = (-0.04 * x) + (0.85 * y) + 1.6
x, y = newx, newy
elif rand < 0.93:
newx = (0.2 * x) - (0.26 * y)
newy = (0.23 * x) + (0.22 * y) + 1.6
x, y = newx, newy
else:
newx = (-0.15 * x) + (0.28 * y)
newy = (0.26 * x) + (0.24 * y) + 0.44
x, y = newx, newy
draw.point(
(size[0]/2.0 + x*size[0]/10.0, y*size[1]/12.0),
fill='#0f0')
im.save("fern.png", "PNG")
I have no idea how it works mathematically, but it's quite satisfying to make something so complex with such a small amount of code.
To get the same image that I got, you'll have to play around with the image size and the size of the sample — I generated a much larger image with a huge sample and shrunk it for the web — there seems to be a sweet spot for the number of iterations required for an image size.