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