SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

.NETでマンデルブロ集合を描く

リアルタイム描画のシンプルなサンプル

実装

 前述のからくりに従い、フォームのデザインと各クラスの設計/実装を行います。

絵描きコビト:MainForm

 絵描きコビトでもあるフォーム:MainFormには描画カンバスとなるPictureBox、START/CANCELボタン、定周期起動のためタイマー、計算コビトをバックグラウンドで働かせるBackgroundWorkerを貼りつけます(図4)。 Button,Timer,BackgroundWorkerからの各イベントのハンドラとなるメソッド群の他にもうひとつ、計算結果(点の位置と演算繰り返し回数)を基に方眼紙:SectionPaperに打点するメソッド:Plot(int x, int y, int count)を定義します。Plotは色鉛筆セット:ColorPaletteからcountに対応する色を得て方眼紙に打点するとともに、CANCEL ボタンが押されたことにより計算を中止しなければならないことを計算コビトに伝えるため、計算中止時にはfalse を返すこととします。

図4 アプリケーションの画面デザイン
図4

色鉛筆セット:ColorPalette

 ColorPaletteは極めて単純です。要素512のColor配列をコンストラクト時に初期化するだけ。

方眼紙:SectionPaper

 SectionPaperはその内部に方眼紙本体とも言えるBitmapをメンバとして持ち、コンストラクト時に生成します。また、方眼紙上の点 (X,Y)からその点に対応する複素数を返すメソッドGetPointを実装するため、方眼紙の左上隅/右下隅に対応する複素数ふたつを与えて GetPointに備えるSetScaleメソッドを用意します。

計算コビト:MandelbrotPlotter

 このアプリケーションの実質的な本体なのですが、実装自体はかなりシンプルなものになりました。方眼紙から幅と高さを得て、それぞれの大きさで二重のループを回してひたすら計算します。計算結果はdelegateを使ってMainFormのPlotを呼び出すことにしました。彼自身は計算することが本業であり、結果に応じた描画には関わらないのがスジと考えましたから。

 上記4つのクラスの主要メンバ/メソッドとクラス間の関連を図5に示します。

図5
図5
いい加減に作った複素数クラス

 C++/CLI では標準C++ライブラリが提供するクラスのほとんどを利用できます。今回必要になる複素数についても、C++/CLI では標準C++ライブラリの std::complex<T> を用いました。.NET Frameworkには複素数を表現するクラスの持ち合わせがないので、必要最低限のメソッドを持った複素数クラス DComplex を実装しました。

// C#版 複素数:DComplex
public struct DComplex {
  private double re_;
  private double im_;

  public DComplex(double r, double i) { re_ = r; im_ = i; }
  public double Real() { return re_; }
  public double Imag() { return im_; }

  public static DComplex operator +(DComplex c1, DComplex c2)
    { return new DComplex(c1.re_ + c2.re_, c1.im_ + c2.im_); }
  public static DComplex operator *(DComplex c1, DComplex c2)
    { return new DComplex(c1.re_*c2.re_ - c1.im_*c2.im_, c1.im_*c2.re_ + c1.re_*c2.im_); }
  public double Norm() { return re_ * re_ + im_ * im_; }
}

 C#, VB.NET, C++/CLI による実装はそれぞれのプロジェクトを覗いていただくことにして、気になる実行速度なんですが、どの言語での実装も速度はそんなに変わらず、僕の環境では描画開始から終了まで2秒足らずでした。その昔描いたときには半日近くかかりましたから一万倍以上のスピードです。ケタ違いにいい時代になったものです。

謝辞

 クラス図その他の作図には チェンジビジョンの astah* community を使いました。優れモノをフリーで公開してくれてるチェンジビジョンに感謝。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4650 2009/12/10 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー