フラクタル図形を描こう(2)

前回の授業では、EGGX ライブラリー関数を組み合わせて角座標表示で直線を描くための関数を自作した。
そして、関数の再帰的呼出しを持ちいることで、簡単なプログラムで複雑な図形を描画する事を学んだ。
今回は、この方法を持ちいてフラクタル図形を描画する。

プログラム例3:フラクタル図形を描く(KOCH 曲線)koch.c


プログラムの構造の説明: 

関数 koch は線の長さと次数を引き数とする。ひとつの関数 koch が線の長さを3分の1,次数を1増やして、4つの koch を呼び出している。このカスケード(ねずみ算的増大)を繰り返していき、次数がNになった時点で実際に線を引く。Nが大きい場合には、とんでもなく大きな回数の同じ関数koch が呼び出されている。

演習1:上のプログラムkoch.c をファイルに作成し、コンパイル、実行せよ。spiral.cのプログラムの作成と同様にlines.cをコピーして、異なる部分を編集して作成せよ。
次数 N を尋ねてくるので、0 から8までの整数を順番に入力して、次数による図形の変化を見よ。

プログラム自体は、非常に簡単であるが、Nが大きくなると実際に呼び出される関数の数は天文学的になり、描画される図形は非常に複雑になる(細部に渡ってフラクタル構造ができる)。

これが再帰的呼び出しのパワーである。

実際に自然界に存在するフラクタル図形も簡単な物理過程の膨大な繰り返しから生み出されれているのかも知れない(カリフラワー、川の分岐、海岸線、血管枝分かれなど)。

演習2:

説明したturn, sen_hikiなどの関数を用いて、以下の図形を描画するプログラムを作成せよ。

描画図形の説明:

幅500、高さ500の描画用ウインドウを作る。ウインドウ座標で(100., 250.)を始点として、長さ300.の線を水平に描く。この線を一辺とする星形図形を描画せよ。

ヒント:星の先端の角度はいくらであろうか?中学校の幾何学を思い出して、計算せよ。

演習3:

演習2で作成した星形図形(上図)の各辺をkoch図形にした図形を描画するプログラムを作成せよ。プログラムでは、koch図形描画のプログラムと同様に、degree N(整数値)を入力し、その次数のkoch図形を描画するようにせよ。

ヒント:星形図形の描画プログラムに関数kochを組み合わせると簡単に作成できる。

描画実行例:

N=0の場合

N=1の場合
各辺がN=1のkoch図形になっていることを確認せよ。

N=2の場合

N=8の場合

課題4:

授業で説明したCantorセットは、一本の線分を3等分し、その真ん中を削除して行く作業を再帰的に行うことで作成される。実は、koch曲線で1本の線分を3等分して、真ん中にテント(三角形)を作ることを行わなければCantorセットになることが判る。この関係を用いて、koch.cをcantor.cと名前を変えてコピーし、適切な変更を行って、指定した次数(ジェネレーション)のCantorセットを作図するプログラムを完成せよ。

インデックスに戻る