3Dフラクタル

キモウツクシス!
http://www.skytopia.com/project/fractal/mandelbulb.html

触発されて自分でも式をいろいろためしたけど、なかなか面白い形は出ない。
球面から球面への写像で3対1か4対1くらいで、多項式で表されるものがあれば多分それが正解。1対2なら複素数の二乗の単純な拡張で(x^2-y^2, 2xy, 2xz)てのがあるけど、不動点を北極とすると赤道が全部南極へ行ってつぶれてしまう。これは緯度を二回周る変換。つぶれる領域がどんどん増えるので二次元マンデルブロと比較してなめらかな領域が目立つ。経度二倍ならそういう特異点はないがsqrt()の計算が入って整数次数でなくなる&多少重くなる。でもそっちのほうが有望そうだな。

これがコード。400x400の画像で変換8ステップ程度なら20秒ほどで画像を生成します。いろいろお試し用。こんな130行ほどのコードで色々形が出てくるわけで、数学偉大なり。
http://d.hatena.ne.jp/ita/00010410

N+1段階目の立体は一般にN段階の立体の内側にあるので、あるピクセルについてざっくりとN段の境界のZ値を計算したらそれを初期値にN+1段の境界を2分法とかでもとめることを繰り返す。明るさ計算のための法線は差分で計算。
変換が、あるベクトルの方向を変えて長さRをRのn乗にして別のベクトルV0を足す場合、発散する半径は Rc=pow(2, 1/(n-1.0))となる。R>Rc かつ|V0|<Rcならば |次の場所|> R^n-|V0| >R となり必ず長さが伸びる。

上記サイトの絵は座標と法線を計算した後、そこから数千の方向に光を飛ばしてブロックされずに外にいける線の合計で輝度を計算してるから奥まったとこが暗い。大変な計算。各ピクセルのZ値をまず全部計算して、その凹凸地形で相互に光線をさえぎるのを計算すればいい。RogueLikeゲームの視界計算コードの3D版。なんか速いアルゴリズムありそうだな。とりあえずあるピクセルの位置のZ値の高さに立って、周囲の方向を360くらいに区切って、各方位で一番高い仰角を計算してやればどのくらい空が広いか計算できる。ちょっとした明るさ補正なんでそんなんで十分だろな。とはいえピクセル数の二乗の計算になるからそれでも大変。