課題
レベルkとサイズsを指定したときに,以下のように正六角形で構成される雪の結晶のような図形を描くメソッドを作成し,そのメソッドで実際に図形を描くプログラムを提出してください.
もくじ
「雪の結晶」の構造
今回描く「雪の結晶」は次のような再帰的な構造をもっています. 以下描く図形を「結晶」と書くことにします.
- レベルkの結晶(k>0) = レベル(k-1)の結晶×6個 + 中央の正六角形
- レベルkの結晶(k>0)を構成するレベル(k-1)の結晶
- 結晶に外接する正六角形の1辺の長さは,レベルkの結晶の場合の1/3になっている.
- 中央の正六角形の頂点の一つと頂点で接している. 左右に隣接するレベル(k-1)の結晶とも1頂点ずつで接している.
- レベル0の結晶 = 正六角形
描画方法に関するヒント
レベルkの結晶は,再帰呼び出しメソッドによって描画できます. そのメソッドを作成するためのヒントを示します. 以下では亀の位置と向きを合わせて亀の状態と呼ぶことにします.
- メソッドの処理を開始する時点ではレベルkの結晶の中心,つまり中央の正六角形の中心に亀がいるものと仮定します(サイズはsとします).
- k = 0のときは1辺の長さsの正六角形を描きます.
- k > 0のときは次のように描きます.
- s/3のサイズのレベル(k-1)の結晶を繰り返し処理で(適切な位置に)6つ描く(再帰呼び出し)
- 中央の正六角形を描く(1辺s/3)
- 結晶を描き終えた時点で,結晶を描き始めたときの最初の状態に亀を戻します.
つまりメソッド実行終了時にはメソッド実行開始時と亀が同じ状態になっているようにします.
こうしておけば,レベルk(k > 0)の結晶を描く過程において,レベル(k-1)の結晶を一つ描き終えた時点で,それを描き始めたときと同じ状態に亀が戻っていることになり, レベルkでの亀の動作を設計するにあたって,レベル(k-1)以下で亀がどう動くか,その影響を考える必要がなくなります.
なお亀のある時点での状態(「位置」と「向き」)を保存して,後で亀をその状態に戻すには, markとback(あるいはhover { back })を組み合わせて使います. (タートルの描画機能一覧).
プログラムテンプレート
次に示すプログラムのテンプレート(雛型)を使ってください. このプログラムは名前を適宜変えた上で保存して利用してください.
Tips
- レベルの設定
レベルk+1では(レベルkの6倍+1)個の図形を描くことになります. またレベルを上げすぎると最終的に描かれるレベル0の図形のサイズが小さくなりすぎて, 綺麗に描けなくなります. 描画時間と描画できる精度を考えれば, 描くことのできる結晶のレベルはせいぜい4,5ぐらいまででしょう. - 最高速
set_speed(MAX_SPEED)で描画の速さを最大に設定できます.
サンプルプログラム
再帰呼び出しのプログラムのサンプルを示します. プログラムをブラウザの画面で開いたときに文字化けしてしまう場合には, ダウンロードしてEmacs等で開いてみてください.
日置尋久(HIOKI Hirohisa)
Last modified: Sat Dec 06 15:38:14 JST 2025