コッホ曲線 (フラクタル図形)

コッホ曲線とは、フラクタル図形の一種です。
線分を3等分し、分割した真ん中の線分を底辺とする正三角形を描く(ただし底辺は消す)ことを無限に繰り返すことによって得られる図形です。

詳しくはこちら(Wikipoedia)をご覧ください。

定義としては、作図手順を無限に繰り返して得られる図形を言うのだそうですが、
無限に繰り返すことはできないので、ここでは、繰り返す回数を指定できるようにしました。

僕のプログラムでは、途中でウェイトさせている関係もあって、 この繰り返し数は、6 くらいが
現実的な数字です。

 下のプログラムのTextBoxに6までの数字をいれてボタンを押してください。1,2,3,4と順に入れて実行させれば、
コッホ曲線がどんなふうにして描くのかが理解できると思います。 

KochCurveクラスの中心的なメソッドは、Draw(Point p1, Point p2, int generation) メソッドです。
generationは繰り返し回数で、再帰呼び出しのたびに、-1 され、0 になったら、再帰呼び出しをストップします。。p1,p2は、線分の両端を示します。p1,p2の両端の位置が与えられると、その  3 等分した点と、そこから得られる正三角形の頂点を求め、4本の線分を引きます。ただ、このときに実際に線を引くのではなく、generation を  -1 し、Drawメソッドを再帰呼び出しすることで、図形を描いていきます。

実際に線分を描くのは、generationが 0になったときで、このときに、OnDrawイベントを発行します。
このクラスを利用する側(MainPageクラス)では、OnDrawイベントを購読し、その引数 KochCurveEventArgs
オブジェクトの値を見て、線分を引いていきます。
KochCurveクラスは、Silverlight非依存のクラスですので、WindowsFormアプリでも そのまま使えるはずです。

MainPage クラスでは、OnDrawイベントハンドラで、KochCurveEventArgsの情報を使い、
WriteableBitmapオブジェクトに、線分を引いています。
WriteableBitmapオブジェクトは、ImageコンポーネントのSourceプロパティにバインドされているので、
WriteableBitmapが更新されれば、Imageコンポーネントに更新が反映され描画が行われます。

以下、C#+Silverlightのコードです。

■KochCurve.cs


■MainPage.xaml.cs


■MainPage.xaml