1. ホーム
  2. python

[解決済み] タートルグラフィックスを用いたシェルピンスキーの三角形の再帰計算

2022-01-31 22:26:54

質問

pythonでturtleを使ってシェルピンスキーの木を描くプログラムを書こうとしています。以下は私のアイデアです。

import turtle
def draw_sierpinski(length,depth):
    window = turtle.Screen()
    t = turtle.Turtle()
    if depth==0:
        for i in range(0,3):
            t.fd(length)
            t.left(120)
    else:
        draw_sierpinski(length/2,depth-1)
        t.fd(length/2)
        draw_sierpinski(length/2,depth-1)
        t.bk(length/2)
        t.left(60)
        t.fd(length/2)
        t.right(60)
        draw_sierpinski(length/2,depth-1)
    window.exitonclick()


draw_sierpinski(500,1)

プログラムがelse文の後の2行目に到達しないのですが、なぜでしょうか?どなたか教えてください。

どのように解決するのですか?

関数内部でturtleやwindowオブジェクトを生成してはいけないと思います。というのも draw_sierpinski を深さ1で呼び出すと、4つのウィンドウと4つのカメが別々に作成され、それぞれが1つの三角形を描くだけになってしまいます。そうではなく、1つのウィンドウと1つのタートルのみにするべきだと思います。

import turtle
def draw_sierpinski(length,depth):
    if depth==0:
        for i in range(0,3):
            t.fd(length)
            t.left(120)
    else:
        draw_sierpinski(length/2,depth-1)
        t.fd(length/2)
        draw_sierpinski(length/2,depth-1)
        t.bk(length/2)
        t.left(60)
        t.fd(length/2)
        t.right(60)
        draw_sierpinski(length/2,depth-1)


window = turtle.Screen()
t = turtle.Turtle()
draw_sierpinski(500,1)
window.exitonclick()

結果


この結果は、深さ1の三角形の場合、かなり良いように見えますが、次のように呼び出した場合はどうでしょうか? draw_sierpinski(100,2) ?

おっと、これはまずい。これは、この関数が図形を描いてから、カメを元の開始位置と角度に戻すはずだからです。しかし、深度1の画像から明らかなように、カメは元の位置に戻らず、左の斜面の途中まで来てしまっている。カメを元に戻すには、何か追加のロジックが必要です。

import turtle
def draw_sierpinski(length,depth):
    if depth==0:
        for i in range(0,3):
            t.fd(length)
            t.left(120)
    else:
        draw_sierpinski(length/2,depth-1)
        t.fd(length/2)
        draw_sierpinski(length/2,depth-1)
        t.bk(length/2)
        t.left(60)
        t.fd(length/2)
        t.right(60)
        draw_sierpinski(length/2,depth-1)
        t.left(60)
        t.bk(length/2)
        t.right(60)

window = turtle.Screen()
t = turtle.Turtle()
draw_sierpinski(100,2)
window.exitonclick()

結果