はじめに
マンデルブロー集合はフラクタル図形の一種として有名で、これを描画する方法は広く知られています。ここでは、単なる描画ではなく、マンデルブロー集合から面白いパターンを容易に探索できるようにしました。
- 完成版のアプレットを見る
対象読者
複素数演算に興味を持ち、複素数が作り出す不思議な世界を旅したい人。
必要な環境
J2SE 5.0を使っていますが、それより古いバージョンでも大丈夫です。繰り返し回数を増やすとCPUパワーが必要になります。
マンデルブロー集合とは
ポーランド生まれの数学者Benoit B. Mandelbrotが、1982年に出版した『The Fractal Geometry of Nature』で紹介してから、急に有名になりました。
マンデルブロー集合とは、ZおよびCを複素数とし、Zの初期値を実数部0、虚数部0として、Z=Z2+Cの演算を多数回繰り返しても、Zの絶対値が一定の値(例えば2.0)を超えず、発散しないCの値の集まりをいいます。Z=Z2+Cが最も一般的ですが、Z=Z3+Cやその他の式を用いる場合もあります。以後は、複素数を表すのにZやCなどの太字を用いることを省略します。
実際には、繰り返し回数に上限を設けて(そうしないと、計算時間が無限になる)、その回数でもZの絶対値が一定の値を超えない場合は、発散しないものと定義し、マンデルブロー集合のメンバーに加えます。
マンデルブロー集合を、Cの実数部と虚数部を用いて二次元複素平面に表示したのがマンデルブロー図形で、細部も同じような形をしており、代表的なフラクタル図形です。マンデルブロー集合の領域を黒などで表し、それ以外の領域では、Zの絶対値が一定の値(例えば2.0)を超えるまでの繰り返し回数をカラーで置き換えて、美しい独特のパターンを表現します。
マンデルブロー集合の面白さ
マンデルブロー集合の描画は、そのフラクタル性と興味ある形状から、盛んに行なわれてきました。しかし、多くは、基本図形の描画に留まっていました。それは、マンデルブロー集合の周辺部には、繰り返し回数を数万回に大きくして、ようやく発散する個所が多数あり、それらの探索にはCPUパワーがないと時間がかかったからです。しかし、そこは前人未踏の領域で、面白い図形が隠されている可能性があり、最近のCPUの進歩のお陰で、多くのホビイストが探索を始めています。
マンデルブロー集合のいろいろ
マンデルブロー集合は、Z=Z2+Cが最も一般的ですが、広義のマンデルブロー集合として下図のものなどが知られています。図で左上は基本形で、右下は、Zの共役複素数(Z’で表す)の二乗を用いたものです。これらは、いずれも本記事で紹介するプログラムの一部を変更して描画しました。条件は、それぞれの図形の下に記してあります。
プログラムの概要
このプログラムは、複素数の演算を繰り返して実行します。特にComplex
(複素数)クラスを設けるまでもなく、実数部と虚数部とに分けて演算すれば可能ですが、将来の利用も考えてComplex
クラスを作成しました。
マンデルブロー集合の図形を部分的に拡大し、興味ある個所を探索するには、マウスクリックによる場所の指定と、クリックごとの拡大を必要とします。ここでは、マウスクリックにより、その場所が新しい画面の中央に移動し、[クリック倍率]で指定された倍率で画面が広がるようにしました。
自分がかつて探索した場所を再び訪れたい場合や、他の資料に示されている場所を追試してみたい場合のために、座標を外部から入力する機能を付加しました。
[繰返し回数の上限]は、十分大きくとらないと、新しい興味ある図形を探索できません。しかし、その場合は一回の実行に時間がかかります。そこで、すべての設定値を確認してから、慎重に実行に移れるように、[外部設定]や[実行]のボタンを設けました。
図2のフローチャートに示すように、このプログラムの主要部(paint()
)は次の内容からなっています。
- 描画する点の位置に応じて、Cの実数部
creal
と虚数部cimag
を計算する。 - Zを0+0iに初期化し、繰り返し回数
count
をクリヤする。 - 本プログラムの中心であるZ=Z2+Cと、Zの絶対値の二乗である
value
を計算する。 - 繰り返し回数
count
をインクリメントする。 - 繰り返し回数
count
が繰り返し回数の上限count_max
を超えた場合には、count=-1
に設定して、ループを抜ける。 - Zの絶対値の二乗である
value
が4.0を超えると、発散したとみなし、ループを抜ける。 - 発散に必要とした繰り返し回数
count
、または繰り返し回数の上限であるcount_max
を超えても発散しなかったことを表すcount=-1
を使って、描画すべき色を設定する。 - 上記の色で、描画する。