マンデルブロー集合の描画
Visual C++/CLRによるピクセル単位の描画
マンデルブロー集合(Mandelbrot set)の描画プログラムVisual C++/CLR版を、Delphi版(岡本安晴「Delphiプログラミング入門」、1997、CQ出版株式会社;リスト3.5.1)を基に作成した。プログラムファイルは、まとめて圧縮ファイルPaintMandelbrot.zipとして用意した。ファイル名PaintMandelbrot.zipをマウスの右ボタンでクリックするとダウンロードできる。ダウンロードしたファイルは、マウスの右ボタンクリックで表示されるメニュから「解凍」あるいは「展開」を選んで解凍すれば、Visual C++などから開くことができる。
マンデルブロー集合とは、数列
において、が発散しない複素数cの集合である。マンデルブロー集合の描画プログラムでは、発散の度合いに応じて色付けすることにより、図1のようなパターンを描く。
図1 マンデルブロー集合の描画例
実行形式のプログラムPaintMandelbrot.exeは、.NET Framework3.5対応である。ファイル名PaintMandelbrot.exeをクリックしてダウンロード・実行すると、まず図2のウィンドウが表示される。
図2 起動時のウィンドウ
「描画」ボタンのクリックで、計算が始まり、図1のパターンが描かれる。図1の状態で、画面左上の「反転」ボタンをクリックすると、色の反転が行われて図3のようになる。
図3 色の反転
さらに「反転」ボタンをクリックすると、図1に戻る。
数列の収束状況の判定は次の関数check_c
int check_c( cmplx c ){
int N = 0;
cmplx
z(0.0, 0.0);
do {
z
= z * z + c;
N++;
}
while ((Abs(z) < 2.0) && (N <
100));
return N;
}
によって行われている。型cmplxは複素数を表わすものであり、PainMandelbrot.zipを解凍して得られるヘッダーファイルcommon.hにおいて宣言されている。また、ソースファイルcommon.cppでは、演算子オーバーロードが、例えば
cmplx
operator + ( const
cmplx & L, const cmplx & R ){
cmplx
tmp;
tmp.rl
= L.rl + R.rl;
tmp.im
= L.im + R.im;
return tmp;
}
というように行われている。なお、行列演算子のオーバーロード・プログラム例をウェブサイト<重回帰分析>に用意した。
関数check_cによる収束状況の判定結果は変数Nに設定され、以下のコードに示されるようにビットマップbmにピクセル単位で色の設定が行われる。
for (int ix = 0; ix < iw; ix++){
for (int iy = 0; iy < ih; iy++){
cmplx
c( R0 + ix * (R1 - R0) / iw, I0 + iy * (I1 - I0) / ih );
int N = check_c( c );
bm->SetPixel(
ix, iy, SetColor(N) );
}
pictureBox1->Image = bm;
Update();
}
色の反転も同様に、以下のコードに示されるようにピクセル単位で行われている。
for (int ix = 0; ix < iw; ix++){
for (int iy = 0; iy < ih; iy++){
Color cl = bm->GetPixel( ix, iy );
int cr =
255 - cl.R;
int cg =
255 - cl.G;
int cb =
255 - cl.B;
bm->SetPixel( ix, iy, Color::FromArgb(
cr, cg, cb ) );
}
pictureBox1->Image = bm;
Update();
}
Visual C++プログラミングの解説を<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房>として用意した。