ドラゴン曲線

フラクタル図形の一種であるドラゴン曲線です。
どんな図形なのかは、以下の Solve ボタンを押してみてください。 大抵の人は、「ああ、見たことある」と思う有名な図形です。


以下、ソースコードの簡単な説明です。

DragonCurve クラスが、ドラゴン曲線を描くクラスです。SilverlightのWriteableBitmapに依存していますが、依存しているのは、線を引く部分だけなので、そこを書きかえれば、他の環境でも動作するクラスになると思います。
DragonCurve クラスには、Execute メソッドがあり、これに、ビットマップと 世代数 generationを入れることで、 ドラゴン曲線をビットマップに描き、ビットマップを返します。 Executeメソッドは、描画の基準となる2つの点を求め、Drawメソッドを呼び出し、ドラゴン曲線を描いていきます。

Drawメソッドは、再帰メソッドになっていて、 引数 generationは、再帰メソッドを呼び出す深さを表しています。 Drawメソッドは、2つの点 p1,p2から次の一点 c を求め線を引き、 (p1,c) (p2,c) それぞれについて、Drawメソッドを再帰的に呼び出すことで、図形を描いてい行きます。
NextPoint が、次の点 c を求めるメソッドですが、思いのほか複雑になってしまいました。 もっと簡潔に書けるようなきもするのですが...。

MainPageクラスが、このDragonCurve.Executeをgenerationの数を増やしながら 一定間隔(ここでは、0.5秒間隔)ごとに呼び出し、1次、2次、3次、... 15次 のドラゴン曲線を描画していってます。
ImageコントロールとWriteableBitmapのオブジェクトとバインドしているので、DragonCurve.Executeメソッドで得られたWriteableBitmapのオブジェクトのInvalidateメソッドを呼び出すことで、再描画させています。
一定間隔ごとに、DragonCurve.Executeを呼び出すのには、DispatcherTimer クラスを使っています。 このクラスは、WindowsForms の Timer クラスとほぼ同じですね。

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

■DragonCurve.cs

■MainPage.xaml.cs

■MainPage.xaml