[解決済み] タートルグラフィックスを用いたシェルピンスキーの三角形の再帰計算
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()
結果
関連
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] 末尾再帰とは何ですか?
-
[解決済み] Matplotlibでプロットを表示するのではなく、画像ファイルに保存する。
-
[解決済み] Pythonの最大再帰深度とその増やし方とは?
-
[解決済み】forループを使った辞書の反復処理
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
Python jiabaライブラリの使用方法について説明
-
Pythonによるjieba分割ライブラリ
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
Pythonの@decoratorsについてまとめてみました。
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】Python elifの構文が無効です【終了しました