Up

マンデルブロ集合とジュリア集合の描画

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の描画ウィンドウを見ることができない。

 

Up