マンデルブロ集合とジュリア集合の描画
tkinter/Pythonによる描画
マンデルブロ集合およびジュリア集合の描画プログラムをtkinterを使って書いてみた。以下に示すように簡単なスクリプトで描画できた。まず、マンデルブロ集合の描画についての説明を行い、次にジュリア集合の描画の説明を行うが、基本的に同じようなプログラムである。2つのプログラムは、まとめて圧縮ファイルprgs.zipとした。
マンデルブロ集合の描画は、次のようにして行われる。
まず、複素数について以下の繰り返し操作を行う。
ステップ1
ステップ2 が既定の値を超えていたら、このループを終了する。
ステップ3
ステップ4 が既定の基準値より大きいとき、このループを終了する。
ステップ5 とおき、ステップ2に戻る。
上の繰り返しにより、複素数がステップ3の操作によって発散するかどうか、あるいは発散のしやすさがの値によって判定され、それに応じて複素平面上におけるの点の色付けが行われる。プログラム例をリスト1に示す。
リスト1
from tkinter import *
c_width = 600
c_height = 600
c = Canvas(width = c_width, height =
c_height, background = 'white')
c.pack()
def check_Mandelbrot(z, max_count =
100):
count = 0
z1 = z
crtrn = 2.0 + abs(z)
while count <= max_count:
if
abs(z1) > crtrn:
return count
z1 =
z1 ** 2 + z
count += 1
return max_count
def SetRGB(w):
w = w**0.3
return
'#{0:0>2X}{1:0>2X}{2:0>2X}'.format(int(w*255), 0, int((1-w)*255))
xmin = -2.0
xmax = 2.0
ymin = -2.0
ymax = 2.0
xrange = xmax - xmin
yrange = ymax - ymin
xstepsize = xrange / c_width
ystepsize = yrange / c_height
ix = 0
while ix <= c_width:
iy = 0
while iy <= c_height:
z =
complex(xmin + ix * xstepsize,
ymin + iy * ystepsize)
count = check_Mandelbrot(z, 100)
if
count >= 100:
c.create_rectangle(ix, iy, ix+2, iy+2, fill = "#FFFF00",
outline = '#FFFF00')
else:
c.create_rectangle(ix, iy, ix+2, iy+2,
fill
= SetRGB(count/100),
outline = SetRGB(count/100))
iy
+= 2
ix += 2
リスト1のプログラムを実行すると、しばらくの計算時間の後、図1の描画が表示される。
図1
リスト1をUbuntuで実行するときは、プログラムの最後に
input(‘Press the Enter’)
などのスクリプトを置いておき、Enterキーを押すまでプログラムが実行中であるようにしておく必要がある。プログラムが実行終了すると、描画ウィンドウも消えてしまうので、図1の描画ウィンドウを見ることができない。
ジュリア集合の描画は、次のようにして行われる。
まず、複素数について以下の繰り返し操作を行う。
ステップ1
ステップ2 が既定の値を超えていたら、このループを終了する。
ステップ3
ここで、はある複素定数である。
ステップ4 が既定の基準値より大きいとき、このループを終了する。
ステップ5 とおき、ステップ2に戻る。
上の繰り返しにより、複素数がステップ3の操作によって発散するかどうか、あるいは発散のしやすさがの値によって判定され、それに応じて複素平面上におけるの点の色付けが行われる。プログラム例をリスト2に示す。
リスト2
from tkinter import *
c_width = 600
c_height = 600
c = Canvas(width = c_width, height =
c_height, background = 'white')
c.pack()
def check_Julia(z, c, max_count =
100):
count = 0
z1 = z
crtrn = 2.0 + abs(z)
while count <= max_count:
if
abs(z1) > crtrn:
return count
z1 = z1 ** 2 + c
count += 1
return max_count
def SetRGB(w):
w = w**0.3
return
'#{0:0>2X}{1:0>2X}{2:0>2X}'.format(int(w*255), 0, int((1-w)*255))
xmin = -2.0
xmax = 2.0
ymin = -2.0
ymax = 2.0
xrange = xmax - xmin
yrange = ymax - ymin
xstepsize = xrange / c_width
ystepsize = yrange / c_height
cv = complex(-0.8, 0.156)
ix = 0
while ix <= c_width:
iy = 0
while iy <= c_height:
z =
complex(xmin + ix * xstepsize,
ymin + iy * ystepsize)
count = check_Julia(z, cv, 100)
if
count >= 100:
c.create_rectangle(ix, iy, ix+2, iy+2, fill = "#FFFF00",
outline = '#FFFF00')
else:
c.create_rectangle(ix, iy, ix+2, iy+2,
fill
= SetRGB(count/100),
outline = SetRGB(count/100))
iy
+= 2
ix += 2
リスト2のプログラムを実行すると、しばらくの計算時間の後、図2の描画が表示される。
図2
リスト2をUbuntuで実行するときは、プログラムの最後に
input(‘Press the Enter’)
などのスクリプトを置いておき、Enterキーを押すまでプログラムが実行中であるようにしておく必要がある。プログラムが実行終了すると、描画ウィンドウも消えてしまうので、図1の描画ウィンドウを見ることができない。