マンデルブロ集合(1) -概要-
今ノイタミナでやってる「フラクタル」のOPは激萌え!
ですが、別にそれに感化されたわけではなくて、先般作ったバーニングシップ・フラクタルの全体像が、世間一般に流布されている図像と何か違うので、ここはやっぱり写経じゃなくて、原理原則を理解せにゃイカンとマンデルブロ集合について学んでみたわけです。
そもそもマンデルブロ集合とは何か。下記の漸化式で z∞ の値が無限大にならない(発散しない)ような c の集合と説明されています。z、c はともに複素数で、z の初期値(z0)は 0 + 0i です。
zn+1 = zn ^ 2 + c;
つまり最初に以下の計算をおこないます。
z1 = z0 ^ 2 + c;
次に、ここで求められた z1 を使って、次の計算をおこないます。
z2 = z1 ^ 2 + c;
同様に z2 を使って、
z3 = z2 ^ 2 + c;
さらに続けて、
z4 = z3 ^ 2 + c;
z5 = z4 ^ 2 + c;
z6 = z5 ^ 2 + c;
z7 = z6 ^ 2 + c;
……
……
……
z∞ = z∞-1 ^ 2 + c;
このように無限に計算し続けても、左辺値が無限に大きくならないような c の集合がマンデルブロ集合であるとのこと。
とすると、マンデルブロ集合をプログラムで描こうとした場合、まずはこの発散するか否かの評価をおこなうループ構造が必要になるということですね。模式的に書くと以下のような感じですか。
var LOOP:int = ∞; var c:複素数 = なんらかの値; var z:複素数 = 0 + 0i; var zNext:複素数; while (LOOP--){ zNext = z * z + c; if (zNext が発散) return; z = zNext; }
繰り返しになりますが z の初期値は 0 + 0i です。0 は二乗しても 0 ですよね。
ということは z∞ が発散するか否かは純粋に c だけに依存するわけで、じゃあその c はどのように決定するの? というのが次の課題。
c が 1 + 1i のときに漸化式が発散するかしないか、次に c が 2 + 1i の時に漸化式が発散するかしないか、次に c が 3 + 1i の時に、c が 4 + 1i、c が 5 + 1i、c が 6 + 1i、c が 7 + 1i …… というような感じで順次評価することになります。そして発散しなかった c を集めると、それがマンデルブロ集合になっているという寸法。
再び模式的に書くと以下のような感じですか。
for(var c = cの初期値; c < cの最大値; c++){ 発散評価のルーチン }
つまりマンデルブロ集合をプログラムで描くには二重のループ構造が必要になるということですね。
ではこれらの模式を ActionScript に落とし込むとどういうコードになるのか、というのが次回の話題。
[ad#aquioux_net_article]
Comments
Tell me what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!