マンデルブロー集合
複素数の計算とグラフィックス描画
複素数の計算例としてマンデルブロー集合のグラフィックス描画例のプログラムを用意した。このプログラムを実行すると下図のような図形の描画が行われる。

サンプルプログラムのファイルは圧縮ファイルmandelbrot.ZIPとしてまとめた。mandelbrot.ZIPはここをクリックしてダウンロードできる。ダウンロードして解凍すると作成されるフォルダmandelbrotにあるプロジェクトファイルmandelbrot.jpxをJBuilderで開くと実行することができる。
プログラムでは、複素数の計算を下図のようなクラス型cmplxを用意して行っている。

下図のように実部の範囲と虚部の範囲を設定してDrawボタンをクリックすると、その範囲のマンデルブロー集合が調べられてその結果が描画される。

実部、虚部の範囲の読み込みと、それに対応する計算とその結果の描画プログラムは次のリストに示されるようになっている。
|
public void jButton1_actionPerformed(ActionEvent e) { Graphics g = jPanel1.getGraphics(); double minr = Double.parseDouble(jTextFieldMinX.getText()); double maxr = Double.parseDouble(jTextFieldMaxX.getText()); double mini = Double.parseDouble(jTextFieldMinY.getText()); double maxi = Double.parseDouble(jTextFieldMaxY.getText()); cmplx c, z; for (int ix = 0; ix < 500; ix++) { for (int iy = 0; iy < 500; iy++) { c = new cmplx(minr + (maxr-minr)*ix/499, mini + (maxi-mini)*iy/499); z = new cmplx(0.0,0.0); int n = 0; do { z = z.sqr().add(c); n++; } while ((z.abs() <= 2.0) && (n <= 100)); n = (int) (n*n*6.0/10001); switch (n) { case 0: g.setColor(new Color(255,255,255)); break; case 1: g.setColor(new Color(0,255,0)); break; case 2: g.setColor(new Color(0,0,255)); break; case 3: g.setColor(new Color(255,255,0)); break; case 4: g.setColor(new Color(255,0,255)); break; case 5: g.setColor(new Color(0,255,255)); break; default: g.setColor(new Color(0,0,0)); } g.fillRect(ix,499-iy,1,1); } } } |
マンデルブロー集合とは以下の条件を満たす複素数の集合である。
![]()
が発散しないことは、
が100を超えるまでの範囲で
の絶対値が2.0を超えるかどうかで判定している。
が100までの範囲で
の絶対値が2.0を超えたときは、そのときの
の値(7つの範囲に分類している)に応じて
に対応する点に色を付けている。
が100を超えても
の絶対値が2.0をないときはその
はマンデルブロー集合に属するとして黒で着色している。
がマンデルブロー集合に属するならば、
である。