Fractal Image

see also http://www.4dsolutions.net/ocn/fractals.html

   1 # A simple fractals program by Kirby Urner
   2 # --- modified to use Tk PhotoImage class rather than PIL
   3 from Tkinter import *
   4 import random
   5 
   6 class Julia:
   7     def __init__(self, size, n=64, box=((-2,1.25),(0.5,-1.25)) ):
   8         self.size = size
   9         self.n = n
  10         self.uleft  = box[0]
  11         self.lright = box[1]
  12         self.xwidth = self.lright[0] - self.uleft[0]
  13         self.ywidth = self.uleft[1]  - self.lright[1]
  14         
  15         self.im = PhotoImage(width=500, height=500)
  16         self.rgb = []
  17         self.make_colours()
  18 
  19     def __call__(self,z):
  20         self.z = z
  21         self.compute()
  22 
  23     def make_colours(self):
  24         for i in range(self.n):
  25             r = i*7%200 + 55
  26             g = i*9%200 + 55
  27             b = i*11%200 + 55
  28             colour = '#%02x%02x%02x' %(r,g,b)
  29             self.rgb.append(colour)
  30             
  31     def compute(self):
  32         print "Computing %s..." % self.__class__.__name__
  33         for x in range(self.size[0]):
  34             for y in range(self.size[1]):
  35                 xp,yp = self.getcoords(x,y)                
  36                 dotcolor = self.fractal(xp,yp)
  37                 self.im.put(dotcolor,to=(x,y))
  38 
  39     def fractal(self,x,y):
  40         n = self.n
  41         z = self.z
  42         o = complex(x,y)
  43         dotcolor = 0  # default, convergent
  44         for trials in range(n):
  45             if abs(o) <= 2.0:
  46                 o = o**2 + z
  47             else:
  48                 dotcolor = trials
  49                 break  # diverged
  50         return self.rgb[dotcolor]            
  51 
  52     def getcoords(self,x,y):
  53         percentx = x/float(self.size[0])
  54         percenty = y/float(self.size[1])
  55         xp = self.uleft[0] + percentx * (self.xwidth)
  56         yp = self.uleft[1] - percenty * (self.ywidth)
  57         return (xp,yp)
  58     
  59 class Mandelbrot(Julia):
  60     def fractal(self,x,y):
  61         n = self.n
  62         z = complex(x,y)
  63         o = complex(0,0)
  64         dotcolor = 0  # default, convergent
  65         for trials in range(n):
  66             if abs(o) <= 2.0:
  67                 o = o**2 + z
  68             else:
  69                 dotcolor = trials
  70                 break  # diverged
  71         return self.rgb[dotcolor]
  72     
  73 root = Tk()
  74 #f = Julia((500,500), n=128, box=((-1.2,1.2),(1.2,-1.2)) )
  75 #or
  76 f = Mandelbrot((500,500))
  77 f(complex(-0.74543,0.11301))
  78 f.compute()
  79 l = Label(root, image=f.im)
  80 l.pack()
  81 root.title('%s' %(f.__class__.__name__))
  82 root.mainloop()
  83 

tkinter: FractalImage (last edited 2011-04-27 02:40:55 by AnthonyMuss)