再帰プログラムでドラゴン曲線を描く

プログラミング初心者の子供に何を教えたらいいの?とお悩みの保護者のためのScratch(スクラッチ)の入門講座。Scratchで猫の動かし方はわかったけど・・・次にどんなことをしたらいいの?という疑問にお答えするシリーズです。

今回は「再帰」について考えてみたいと思います。再帰プログラムを使って、フラクタル図形の一つである「ドラゴン曲線」をScratchで描いてみます。
「再帰」「フラクタル」については以下の記事で解説していますので、もしよろしければそちらを参考にしてみてください。
<再帰プログラムでコッホ曲線を描く>
 

目次

1. ドラゴン曲線って?

1-1. ドラゴン曲線とは?

ドラゴン曲線とはこういう曲線です。
この曲線の描き方を順を追って解説します。最初に直線があります。

 
この直線が、直角三角形の斜辺となるような感じで2本の直線を引きます。最初の直線は消します。これが再帰回数1回のドラゴン曲線です。

そして、先ほどの2本の直線が直角三角形の斜辺となるように、それぞれ2本づつ直線を引きます。前の直線は消します。これは再帰回数2回のドラゴン曲線です。

 
さらに、先ほどの形の各直線が直角三角形の斜辺となるように、各直線ごとに2本づつ直線を引き、前の直線は消します。これは再帰回数3回のドラゴン曲線です。

同様の操作を繰り返すと、再帰回数4回目のドラゴン曲線はこうなります。

 

2. ドラゴン曲線をScratchで描こう

2-1. 再帰を使わないプログラムを作ってみる

再帰プログラムを考える前に、ペンを使ってドラゴン曲線の図形を無理やり描いてみましょう。
向きがわかりやすいように三角形のスプライトを準備します。スプライトの向きが90度の時に、三角形が右側を向くように描きましょう。

 
次に、変数「長さ」を作ります。そして、画面をリセットするプログラムを作りましょう。このプログラムは、cキーを押して実行します。ペンで描いた線を消し、スプライトの位置を元の場所に戻してくれます。

最初の直線を描くプログラムを作ります。これは簡単ですね。

0キーを押してこのプログラムを実行すると、最初の直線が描けました。これを再帰回数0回とします。

次に、再帰回数1回の曲線を描くプログラムを作ってみます。再起回数0回の直線を斜辺とする直角2等辺三角形を描きます。再起回数1回の時の辺の長さをx、再起回数0の直線の長さをaとすると、

三平方の定理より、次の式が成り立ちます。

今回、上の式のaを変数「長さ」としているので、再帰1回目の直線(上の図の赤い線)の長さの式はとなります。

一度、先ほどの再帰回数0回の場所に戻ってから再帰1回目の直線を描くようにします。その場合、再帰1回目の直線を描くプログラムは次のようになります。

1キーを押して再帰回数1回のプログラムを実行してみましょう。

再帰回数1回のドラゴン曲線が描けました。続けて再帰回数2回のプログラムを作ってみましょう。プログラムを見やすくするため回転の方向は左回転で統一し、右回転をしたい場合はマイナスをつけるようにしました。また、先ほどの再帰1回目に出てきた回転の角度、45°と90°を使いたかったので、次のようにプログラムを作りました。

2キーを押して再帰回数2回のプログラムを実行した結果はこちらです。

さらに、再帰回数3回のプログラムを作ってみましょう。

こちらの実行結果はこうなります。

2-2. 再帰プログラムで描いてみる

先ほどの再帰回数1回〜3回のプログラムを並べて比較してみましょう。再起回数1回に対して、再起回数0回を「前の世代」と呼ぶことにします。各世代のプログラムに前の世代がどのように含まれているかを枠で囲って調べてみました。

さて、このプログラムからわかったことをまとめてみましょう。
 ・ピンクの枠の部分について、再帰回数の分だけ45°回転させています。
 ・各プログラムに、前の世代のプログラムが2回出てきます。
  しかし、後半のプログラムは真ん中の回転角度が逆(マイナス)になっています。
 
さて、このような規則をまとめて、ドラゴン曲線を次のように定義してみました。角度のところには「1」か「-1」を入れるようにしておき、「-1」が入ったときは逆に回転するようにします。

また、スタート地点にスプライトの座標と向きを戻す操作、そして45°回す操作を「初期化」ブロックとして定義しました。

まずは数字キーで再帰回数が設定できるようにしたいと思います。下の図のように、0から6までの再帰回数でドラゴン曲線が描けるようにしました。

上のプログラムでは、再帰回数を増やすと下の方がはみ出してしまうことがわかりました。「長さ」とスタート地点の座標を少し調整し、さらに変数で再帰回数を指定して実行できるようにしました。

再帰回数20回でプログラムを実行してみました。

ドラゴン?!っぽい模様ができました。

完成したプログラムはこちらです。1、2、3、4、5・・・とキーを押していくとどんどん細かくなっていきます。
10以上は変数のスライダーで設定した後に、緑の旗を押してください。

3. まとめ

今回は、再帰プログラムを作ってフラクタル図形「ドラゴン曲線」を作りました。
ドラゴン曲線は、「角度が反転する」という部分がわかりづらい曲線だったので、再帰のパターンをみつけるのにとても苦労しましたが、なんとか分かってよかったです。
ドラゴン曲線を描くポイントは以下です

 ・長さの計算に三平方の定理を使う
 ・角度の反転するところを見つける
 ・最初に45°回転する回数が、再帰回数の分だけ増える
ここが分かれば描けますので、ぜひ挑戦してみてくださいね。

この記事を書いた人

目次