Mandelbrot Set(曼德勃羅集)可能是分形 圖形中最有名的圖形,關於它的介紹我就不多寫了,有興趣的可以參考這個鏈接 。下面是關於如何使用Python來畫這個圖形的嘗試。
由於Python標准庫中還沒有對圖形處理的支持,在此我使用了PIL 。先來看一張生成的圖形:
相關的代碼大致是這樣的:
# -*- coding: utf-8 -*-
#
# z<n+1> = z<n> ^ 2 + c
#
# by oldj
# http://oldj.net/
#
# last update: 2010-10-22 22:02:05
#
import time
import Image, ImageDraw
g_size = (40, 30) # 圖形最終尺寸
g_max_iteration = 256 # 最大迭代次數
g_bailout = 4 # 最大域
g_zoom = 2.5 / g_size[0] # 縮放參數
g_offset = (-g_size[0] * 0.25, 0) # 偏移量
g_HSL = (210, 80, 50) # HSL色彩基調
def draw(antialias = True):
zi = 2 if antialias else 1 # antialias: 抗鋸齒 size = [i * zi
size = [i * zi for i in g_size]
zoom = g_zoom / zi
offset = [i * zi for i in g_offset]
bailout = g_bailout * zi
img = Image.new("RGB", size, 0xffffff)
dr = ImageDraw.Draw(img)
print "painting Mandelbrot Set.."
for xy, color in getPoints(size, offset, zoom):
dr.point(xy, fill = color)
print "100%\n"
del dr
if antialias:
img = img.resize(g_size, Image.ANTIALIAS)
img.show()
img.save("mandelbrot_set_%dx%d.png" % g_size)
def getPoints(size, offset, zoom, ti = 0, tstep = 1):
"生成需要繪制的點的坐標及顏色"
def getRepeats(c):
z = c
repeats = 0
while abs(z) < g_bailout and repeats < g_max_iteration:
z = z * z + c
repeats += 1
return repeats
def getColor(r):
color = "hsl(0, 0%, 0%)"
if r < g_max_iteration:
v = 1.0 * r / g_max_iteration
h = ch * (1 - v)
s = cs
l = cl * (1 + v)
color = "hsl(%d, %d%%, %d%%)" % (h, s, l)
return color
xs, ys = size
xw, yh = xs / 2, ys / 2
xo, yo = offset
ch, cs, cl = g_HSL
progress = 0
for iy in xrange(ys):
p = iy * 100 / ys
if iy % 10 == 0 and p != progress:
print ("%d%%..." % p) # 顯示進度
progress = p
for ix in xrange(ti, xs, tstep):
x = (ix - xw + xo) * zoom
y = (iy - yh + yo) * zoom
c = complex(x, y)
r = getRepeats(c)
yield (ix, iy), getColor(r)
def main():
t0 = time.time()
draw()
t = time.time() - t0
print "%dm%.3fs" % (t / 60, t % 60)
if __name__ == "__main__":
main()
其中第8行設置了圖形最終的尺寸,如果想生成大一些或小一些的圖形,可以修改這個參數。第9行是最大迭代次數,這個參數值越高越能得到更多的圖像細節,當然,代價就是需要更多的計算時間。
另外,第47~55行的getColor函數定義了每個點顏色的產生規則,可以在這兒修改顏色規則,畫出更多不同色彩的Mandelbrot集來。
下面是本程序在不同的參數及顏色規則下生成的另外幾副圖。
修改一下上面的代碼,不難生成更多細節圖片。不過,如果不想自己動手,也可以試一下XaoS 這個軟件,通過它,你可以將Mandelbrot集的某個局部放大很多倍。當然,你會發現,無論放大了多少,Mandelbrot集始終有無窮無盡的變化與精致細節。