上へ

マンデルブロー集合の描画

Visual C++/CLRによるピクセル単位の描画

 

 マンデルブロー集合(Mandelbrot set)の描画プログラムVisual C++/CLR版を、Delphi版(岡本安晴「Delphiプログラミング入門」、1997、CQ出版株式会社;リスト3.5.1)を基に作成した。プログラムファイルは、まとめて圧縮ファイルPaintMandelbrot.zipとして用意した。ファイル名PaintMandelbrot.zipをマウスの右ボタンでクリックするとダウンロードできる。ダウンロードしたファイルは、マウスの右ボタンクリックで表示されるメニュから「解凍」あるいは「展開」を選んで解凍すれば、Visual C++などから開くことができる。

マンデルブロー集合とは、数列

において、が発散しない複素数cの集合である。マンデルブロー集合の描画プログラムでは、発散の度合いに応じて色付けすることにより、図1のようなパターンを描く。

無題.jpg

図1 マンデルブロー集合の描画例

 

 実行形式のプログラムPaintMandelbrot.exeは、.NET Framework3.5対応である。ファイル名PaintMandelbrot.exeをクリックしてダウンロード・実行すると、まず図2のウィンドウが表示される。

図2 起動時のウィンドウ

 

「描画」ボタンのクリックで、計算が始まり、図1のパターンが描かれる。図1の状態で、画面左上の「反転」ボタンをクリックすると、色の反転が行われて図3のようになる。

無題.jpg

図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++プログラミング入門勁草書房>として用意した。

 

上へ