Skip to content

Instantly share code, notes, and snippets.

@rpmuller
Created July 12, 2013 20:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save rpmuller/5987623 to your computer and use it in GitHub Desktop.
Save rpmuller/5987623 to your computer and use it in GitHub Desktop.
Mandelbrot and frame's binary fractal trees
#!/usr/bin/env python
"""\
Mandelbrot and Frame's (Binary) Fractal Trees.
See http://www.math.union.edu/research/fractaltrees/
"""
import os
from math import sin,cos,pi
def ftree(iter,origin,t,r,theta,dtheta):
"""\
def ftree(iter,origin,t,r,theta,dtheta):
Extend the fractal tree one iteration.
iter: The iteration number (we stop when iter == 0)
origin: The x,y coordinates of the start of this branch
t: The current trunk length
r: The amount to contract the trunk each iteration
theta: The current orientation
dtheta: The angle of the branch
"""
if iter == 0: return []
x0,y0 = origin
x,y = x0+t*cos(theta),y0+t*sin(theta)
lines = [((x0,y0),(x,y))]
lines.extend(ftree(iter-1,(x,y),t*r,r,theta+dtheta,dtheta))
lines.extend(ftree(iter-1,(x,y),t*r,r,theta-dtheta,dtheta))
return lines
def pil_render_lines(lines,height=300,width=300,fname="bs.png"):
import Image,ImageDraw
img = Image.new("RGB",(width,height),(255,255,255))
draw = ImageDraw.Draw(img)
for line in lines: draw.line(line,(0,0,0))
img.save(fname,"PNG")
#os.system("display %s" % fname) # use ImageMagick to display
return
def main():
# Here we choose initial values. These work fairly well.
# See ftree.__doc__ for details
t = 100
r = 0.6
ang2rad = pi/180.
theta = 90.0*ang2rad
dtheta = 60.0*ang2rad
lines = ftree(8,(150,0),t,r,theta,dtheta)
pil_render_lines(lines)
return
if __name__ == '__main__': main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment