python のturtle でフラクタル

前学期の授業の中にMathematicaを使ってフラクタルを描くっていうのがあって

家でも再現できるように内容をpythonに翻訳してみました。

pythonにはタートルグラフィックス用のモジュールが最初から用意されているようで結構簡単に移植することができました。

pythonが動く環境にあればブログの最後にあるコードリストをコピペすれば実行できると思います。

命令を動きに変える関数

文字列による命令を動きに変える関数を定義します。
'f' で前進, 'r' で右60度回転 'l' で左60度回転

from turtle import *
def move(n):
    if n == 'f':
        forward(10)
        return n
    elif n == 'r':
        right(60)
        return n
    elif n == 'l':
        left(60)
        return n

最初の命令

最初は正三角形を描かせます.

comand = 'frr'*3
map(move, comand)

NestListの実装

def nestlist(fac, v, n):
    if n == 0:
        return [[]]
    l = fac(v)
    return [l] + nestlist(fac, l, n-1)

MathematicaでNestListに対応する関数を定義します.
nestlist(f, v, n) の出力は
[v, f(v), f(f(v)), ..., f^n(v)] となります.

寄り道をさせる

'f'をflfrrflf'に変換します.
この変換で直線(→)は(→↗↘→)となります.

rule1 = 'flfrrflf'
comands = nestlist(lambda lis:lis.replace('f',rule1), comand, 4)    

出力

for comand in comands:
    map(move, comand)
    reset()

単純な置換えを繰り返すことで徐々に複雑な雪の結晶が形成されていく様子を観察することができます.


今回は雪の形のフラクタルを作ってみました。
機会があればば別の形のものもやって見たいと思います。

コードリスト

from turtle import *
def move(n):
    if n == 'f':
        forward(10)
        return n
    elif n == 'r':
        right(60)
        return n
    elif n == 'l':
        left(60)
        return n

def nestlist(fac, lis, n):
    if n == 0:
        return [[]]
    l = fac(lis)
    return [l] + nestlist(fac, l, n-1)

comand = 'frr'*3
map(move, comand)
reset()

rule1 = 'flfrrflf'
comands = nestlist(lambda lis:lis.replace('f',rule1), comand, 4)    
for comand in comands:
    map(move, comand)
    reset()