Pythonのタートル・グラフィックス(8):コッホ(Koch)曲線を描く

有名なコッホ(Koch)曲線を描く。「Turbo Graphics」(安齋利洋・伊吹龍著;1987年)に載っているPascal風のプログラムをなぞって作ったのが以下のものだ:


#coding: utf-8

import myturtle

depth = 5 #再帰の深さ

def koch(length, level):
    global kame

    if(level > 0):
        len1 = length /3
        koch(len1, level-1)
        kame.lt(60)
        koch(len1, level-1)
        kame.rt(120)
        koch(len1, level-1)
        kame.lt(60)
        koch(len1, level-1)

    else:
        kame.fd(length)

         

if __name__ == '__main__':
    
        
    kame = myturtle.MyTurtle()
    kame.ht()
    kame.setposition(-320,-0)
    kame.clear()
    koch(640, depth)

【描画】

コッホ(Koch)曲線

複雑であるが折れ線による「一筆描き」である。このような「一筆描き」ではあるセグメントの折れ線ではこれまで描かれた折れ線の先端を起点として一つの折れ線を描き、その折れ線の先端は次の折れ線の起点となるような処理が必要となる。上のプログラムではこれをkameを大域変数(global)とすることで行っている。こうすることでkameが折れ線を描く毎にkameの属性(位置)が更新される。

このような事情を考慮して直接Pythonで書くと以下のようになる:


#coding: utf-8

import myturtle

depth = 5 #再帰の深さ

def koch(kame, length, level):

    if(level > 0):
        len1 = length /3
        koch(kame, len1, level-1)
        kame.lt(60)
        koch(kame, len1, level-1)
        kame.rt(120)
        koch(kame, len1, level-1)
        kame.lt(60)
        koch(kame, len1, level-1)

    else:
        kame.fd(length)

         

if __name__ == '__main__':
    
        
    kame = myturtle.MyTurtle()
    kame.ht()
    kame.setposition(-320,-0)
    kame.clear()
    koch(kame, 640, depth)

このプログラムではkameは関数kochの引数の一つとして関数kochに渡されるようになっている。このプログラムはPascal風の処理系では期待通りの結果は得られないが、Pythonでは上の描画と同じものが得られる。Pythonでは関数に渡されたオブジェクトkameは関数内の変更を受けて実引数のkameの属性も変更されるからだ。

Pythonではkameを大域変数とするプログラムも、kameを関数の引数として渡すプログラムも作れる。後者は少しトリッキーな気もするが。