マンデルブロ描画プログラム

フラク太郎

【技術情報】 
  マンデルブローをコンピュータで描画するのは簡単です。マンデルブロー集合の式は下記のようにあらわされます。

   Xn+1 = Xn * Xn + C

  n,n+1はXの添え字です。この式にしたがってXnを順繰りに代入して計算して行くと、X(無限)は、有限の数字か無限大に発散するかのどちらかになり、その行方は一つの係数「C」のみにゆだねられます。Xnは初期値として0からはじまります。

  ここでこの数式を複素平面上であらわすと,Xがすべて(X+iY)に、CがCx + iCyに置き変わりますので、上式は下記のようになります。

 Xn+1 + iYn+1
    = (Xn + iYn)*(Xn + iYn)+ Cx + iCy

  二乗や添え字がテキスト形式ではうまくあらわせませんが、上記のようになります。iは複素数です(つまり i*i=−1)。

  この数式を展開し、iの係数の付いた項目と、iのつかない項目に分けて書くと、

  Xn+1 =(Xn * Xn)−(Yn * Yn) + Cx

  Yn+1 =(2 * Xn * Yn) + Cy

  という2つの式が表れます。これでCx,Cyを徐々に変化させて行き、Xn、 Ynのどちらかが、無限大になるか収束するかで、Cx,Cy座標上に点を描いて ゆけばよいわけです。ただし、無限になるかどうかの判断はコンピュータにはでき ませんが、ここでXn,Yn座標が0、0の中心点から2以上の距離になった場合、 そのうちにXn,Ynが発散すると数学的に証明されているのでこれを使用します。
 具体的には円の方程式を使用して

  (Xn * Xn) + ( Yn * Yn ) > 4

 となれば、その時時点で、使用したCx,Cyは発散すると判断します。「フラク太郎」でもこれを使用し、上記式が成立した時点で何回計算を行ったかで色を変えています。ただしこれを行うと計算速度が落ちるため、それほど正確をきさないのであれば、Xn>2又はXn<−2、Yn>2、Yn<−2で近似しても差し支えないでしょう。

 また、ジュリア集合では、上の式の、Cx,Cyは固定となります。「フラク太郎」ではこの値をメニューから設定できるようになっています。
 また、Xn,Xnがマンデルブロ集合の場合0から出発するのですが、ジュリア集合では現在の描画点の座標の複素平面上の値となります。
 マンデルブロとはこの初期値が異なるだけで、計算方法は同じようです。

 これをC++言語で例を示します。

 double x1,x2,y1,y2; //上記数式のXn,Xn+1,Yn,Yn+1に相当します
double cx=-2; //Cx
double cy=-2; //Cy
int x,y; //描画のためのスクリーンに対応する座標です
int seido = 100;  //この例では100回計算しても2以上にならなければ
//「真」と判定します。
double dx;     //画面1ドットに対するCx,Cyの変化量を示します。
 〜 // 200*200のウインドウの作成などの処理
 〜 //
 〜 dx = 4/200; //クリーン上の1ドットが複素平面上のいくつに相当するか
           //計算しておきます。スクリーンは200*200とします
           //複素平面の範囲はcx,cyとも−2から2までとします。
for ( y=0;y<200;y++)
{
cx = -2;
cy = cy + dx ;
for ( x=0;x<200;x++) //平面を描くためのx,yによる2重ループです
{      
x1=0; //x1,y1の初期値は0と決まっています
y1=0; //
for (int i=0;i {
x2=x1*x1 - y1*y1 + cx; //x1は次の式でも使用するので壊さない
                   //ようにします。
  y1=2*x1*y1 + cy; //
x1=x2;
if (x1*x1 + y1*y1 >=4) //円の方程式によって発散を判定
break;       //円の外に出た場合は直ちにループから
                   //抜け出します。
  }
if (i>=seido-1)      //発散か収束かの判定をiで行います
{
//SetPixel等でx,yに集合の真の色を描画します。
        //「フラク太郎」では黒固定です。通常は黒が多いようです。
}
else
{
//setPixel等でx,yの座標に偽の色をつけます。白が一番
//簡単です。「フラク太郎」ではiの値によって色を変えています。
}
cx=cx+dx;
}
}

描画の中心となる処理はこれだけです。とにかく表示させるためにはこれに少々ウインドウの生成を付け加えれば一応は動くものができるでしょう

参考文献:

 ダイヤモンド社 「フラクタルって何だろう」 高安秀樹+高安美佐子著

 全面的に上記著書を参考にしています。何気なくこの本を手にとったのが運のつ き(^_^!)でした。特にコンピュータへの適応は詳しくは解説されておりませんが、 フラクタルの基本的な考え方がわかりやすく説明されており、だれが読んで楽しみ ながら理解できるように工夫されています。著作者であられる高安秀樹さん、高安 美佐子さんに謝辞申し上げます。

【もくじ】に戻る