マンデルブロ集合(2) -内側のループ-

2011 / 02 / 04 by
Filed under: Coding の素 
Bookmark this on Delicious
[`livedoor` not found]
[`yahoo` not found]

前回はマンデルブロ集合を描くプログラムを書く場合、ループ構造の中にループ構造がある、二重のループ構造を取ることになる、という話でした。

  1. 外側のループは、複素数 c の集合を得るために離散的な複素数を順次評価するループ
  2. 内側のループは、漸化式が発散するか否かを評価するためのループ

分かりやすい内側のループからやっつけていきましょう。
いきなり結論から。以下のようなコードになります。パフォーマンス的に明らかに問題のある書き方をしていますが、説明を分かりやすくするための処置です。

var zRl:Number = 0.0;	// (1)
var zIm:Number = 0.0;	// (2)
var zRlNext:Number;		// (3)
var zImNext:Number;		// (4)
var loop:int = 256;		// (5)
while (loop--){
	if (Math.sqrt(zRl * zRl + zIm * zIm) > 2) break;	// (6)
	zRlNext = zRl * zRl - zIm * zIm + cRl;	// (7)
	zImNext = 2 * zRl * zIm + cIm;			// (8)
	zRl = zRlNext;	// (9)
	zIm = zImNext;	// (10)
}

併せて漸化式も改めて載せておきます。


漸化式 zn+1 = zn ^ 2 + c

(1) と (2) は漸化式の zn に関わる値です。(1) が実数部、(2) が虚数部。
(3) と (4) は漸化式の zn+1 に関わる値です。(3) が実数部、(4) が虚数部。
複素数はそのまま扱えないので、実数部と虚数部の二つの値のペアとして処理するので、このような変数になります。
(5) は漸化式の発散を評価するためにループする回数。
漸化式を無限に計算し続けてもその結果が無限に大きくならない(発散しない)ことを確かめるためと言っても、実際に無限回ループを回すなんてできないわけで、適当な値を設定しなければならないんですが、一体いくつにすべきなのか。100回? 1,000回? 10,000回?
まぁ大きければ大きいほど精密なマンデルブロ集合図が描ける理屈ですが、ループ回数を設定は、マンデルブロ集合図をどのように色分けしたいかということに左右されます。詳しくは後ほど述べますが、ここでは256としておきます。
と、ここまでが変数の定義。

次は式について。
(6) は、zn が発散していたら while を離脱する、ということを式にしたもの。
複素数 z の絶対値が 2 を超えると、以後、漸化式は必ず発散するんだそうです(詳しくは「マンデルブロ集合の不思議な世界 – マンデルブロ集合とは」あたりをご覧ください)。
複素数 z の絶対値は「実数部の二乗と虚数部の二乗を加えた数の平方根」なので、このような式になります。
(7) は漸化式の計算の実数部を表したもの。
(8) は漸化式の計算の虚数部を表したもの。
複素数の乗算と加算は以下のとおりなので、それをそのまま記述しています。

乗算 (a + bi) * (c + di) = (ac - bd) + (bc + ad)i
加算 (a + bi) + (c + di) = (a + c) + (b + d)i

(7) の cRl、(8) の cIm は漸化式にある c の実数部と虚数部で、外部から与えられる値です。

で、最後に (9)、(10) で次のループに備える、という流れ。

(6) で発散したらループから離脱という定義をしましたが、離脱するまで(発散するのに)何回ループするのか、ということは漸化式の c によって変わってきます。2回ループしたら離脱するかも知れないし、50回ループするかも知れない。あるいはループを回り切って (6) の break が実行されないかも知れない。
この実際にループした回数を保持しておいて、その回数ごとに領域を色分けすると、よくあるマンデルブロ集合のカラフルな図になるわけです。
よって (5) のループ回数はどのくらいの色数で塗り分けるかを考慮して設定すればよいことになります。

[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!





WP-SpamFree by Pole Position Marketing