转 用Python画Mandelbrot集

照着oldj同学的方法画曼德勃罗集,需要PIL库的支持,我生成的图是1280×800,迭代了1024次,花费了20多分钟。效果如下:

 

  代码如下:

 1 # -*- coding: utf-8 -*-
 2 import time
 3 import Image, ImageDraw
 4  
 5 g_size = (1280, 800) # 图形最终尺寸
 6 g_max_iteration = 1024 # 最大迭代次数
 7 g_bailout = 4 # 最大域
 8 g_zoom = 2.5 / g_size[0] # 缩放参数
 9 g_offset = (-g_size[0] * 0.25, 0) # 偏移量
10 g_HSL = (210, 80, 50) # HSL色彩基调
11  
12 def draw(antialias = True):
13     zi = 2 if antialias else 1 # antialias: 抗锯齿 size = [i * zi
14     size = [i * zi for i in g_size]
15     zoom = g_zoom / zi
16     offset = [i * zi  for i in g_offset]
17     bailout = g_bailout * zi
18     img = Image.new("RGB", size, 0xffffff)
19     dr = ImageDraw.Draw(img)
20  
21     print "painting Mandelbrot Set.."
22     for xy, color in getPoints(size, offset, zoom):
23         dr.point(xy, fill = color)
24     print "100%\n"
25  
26     del dr
27     if antialias:
28         img = img.resize(g_size, Image.ANTIALIAS)
29     img.show()
30     img.save("mandelbrot_set_%dx%d.png" % g_size)
31  
32 def getPoints(size, offset, zoom, ti = 0, tstep = 1):
33     "生成需要绘制的点的坐标及颜色"
34  
35     def getRepeats(c):
36         z = c
37         repeats = 0
38         while abs(z) < g_bailout and repeats < g_max_iteration:
39             z = z * z + c
40             repeats += 1
41         return repeats
42  
43     def getColor(r):
44         color = "hsl(0, 0%, 0%)"
45         if r < g_max_iteration:
46             v = 1.0 * r / g_max_iteration
47             h = ch * (1 - v)
48             s = cs
49             l = cl * (1 + v)
50             color = "hsl(%d, %d%%, %d%%)" % (h, s, l)
51         return color
52  
53     xs, ys = size
54     xw, yh = xs / 2, ys / 2
55     xo, yo = offset
56     ch, cs, cl = g_HSL
57  
58     progress = 0
59     for iy in xrange(ys):
60         p = iy * 100 / ys
61         if iy % 10 == 0 and p != progress:
62             print ("%d%%..." % p) # 显示进度
63             progress = p
64         for ix in xrange(ti, xs, tstep):
65             x = (ix - xw + xo) * zoom
66             y = (iy - yh + yo) * zoom
67             c = complex(x, y)
68             r = getRepeats(c)
69             yield (ix, iy), getColor(r)
70  
71 def main():
72     t0 = time.time()
73     draw()
74     t = time.time() - t0
75     print "%dm%.3fs" % (t / 60, t % 60)
76  
77 if __name__ == "__main__":
78     main()

 

 

 

posted @ 2013-06-05 12:02  lkprof  阅读(638)  评论(0编辑  收藏  举报