'''
Created on Apr 3, 2011

@author: ola
'''
"""
create Sierpinski Triangle using PIL
"""

import Image       # PIL
import ImageDraw   # PIL
import random

def midpoint(p,q):
    return ((p[0]+q[0])/2.0,(p[1]+q[1])/2.0)

def sierpinski(p1,p2,p3, image, level):
    '''
    calculates points for sub triangles, uses recursion for steps
    '''
    
    if level <= 0:
        return
    
    # draw triangles each step through
    
    image.line([p1,p2])
    image.line([p2,p3])
    image.line([p1,p3])
    
    # make smaller triangles from each point and adjacent midpoints
    
    sierpinski(p1,midpoint(p1,p2),midpoint(p1,p3),image,level-1)
    sierpinski(p2,midpoint(p2,p3),midpoint(p2,p1),image,level-1)
    sierpinski(p3,midpoint(p3,p2),midpoint(p3,p1),image,level-1)
    
    
def chaos(p1,p2,p3,image,iters):
    plist = [p1,p2,p3]
    current = (random.uniform(p1[0],p2[0]),.2)
    for x in xrange(iters):
        vert = random.choice(plist)
        mid = midpoint(current,vert)
        image.point(mid,fill='black')
        current = mid


# starting point for equilateral triangle
tpoints = ((0, 700), (700, 700), (350, 0))

level = 8
size = tpoints[1]
picture = Image.new('RGB', size,color='blue')
picture2 = Image.new('RGB',size,color='white')
drawnimage = ImageDraw.Draw(picture)
drawnimage2 = ImageDraw.Draw(picture2)

# draw the triangle and calculate next triangle corner coordinates
sierpinski(tpoints[0],tpoints[1],tpoints[2],drawnimage, level)
picture.show()

chaos(tpoints[0],tpoints[1],tpoints[2],drawnimage2,100000)
picture2.show()
