フラクタル画像倉庫2
こんにちは、チオールです。
前回の記事で予告したとおり、前回の記事で触れられなかった要素の解説や載せられなかった画像の紹介などをします。
hassium277.hatenablog.com
※☝前回
用語
まず、この記事で使う用語を定義します。
ジュリア集合
ググってみるとわかりますが、ジュリア集合の定義は書き手によって多少の揺れがあってややこしいのですが、この記事では以下のように扱います。
の絶対値が無限大に発散しないような初期値の集合を「
のジュリア集合」と呼ぶ。
他の記事での解説では、以下のような違いが見受けられます。
・が
という形の関数に限定されている
・条件が「無限大に発散しない」ではない
Wikipediaの解説は後者に該当し、そっちの方が正しい定義なのではないかという気がするのですが、面倒臭いので「無限大に発散しない」という条件を採用します。
広義マンデルブロ集合
ジュリア集合は任意の複素関数に対して定義されるとしましたが、マンデルブロ集合についてはに限定する定義が主流のようです。
これだと面白くないので、一般の複素関数に拡張した「広義マンデルブロ集合」という概念を定義します。
例えば普通のマンデルブロ集合は「の広義マンデルブロ集合」と表すことができ、前回紹介したマルチブロは「
の広義マンデルブロ集合」となります。
他にもトリコーンはの広義マンデルブロ集合、バーニングシップフラクタルは
の広義マンデルブロ集合に相当します。
ちなみに普通のマンデルブロ集合では「」という条件があり、厳密にはこの条件が無いと形が決まらないのですが、面倒なので定義には含めないことにしました。
この記事では特に明言されていない場合、初期値は0としています。
彩色関数
前回紹介できなかったり投稿後に発見した彩色関数をいくつか紹介します。
この項目内では、以下のコードの仕様を標準とします。
Sub f() Dim x, y, px, py As Double Dim o As Boolean For a = 0 To 2000 For b = 0 To 2000 x = 0 y = 0 o = True For c = 0 To 100 px = x py = y x = px ^ 2 - py ^ 2 + a / 500 - 2 y = 2 * px * py + b / 500 - 2 If x ^ 2 + y ^ 2 > 4 Then Cells(b + 1, a + 1).Interior.Color = (1 - (1 - c / 100) ^ 9) * 255 o = False Exit For End If Next c If o Then Cells(b + 1, a + 1).Interior.Color = 0 Next b Next a End Sub
パーリーパーソン
RGB(x ^ 2 * 64, y ^ 2 * 64, 0)
とにかく明るい配色です。
アレンジすると雰囲気が変わります。
RGB(x ^ 2 * 64, 0, y ^ 2 * 64)
RGB(x ^ 2 * 64, y ^ 2 * 64, 255)
メタリック
RGB(120 + 20 * y, 120 + 20 * y, 120 + 20 * y)
金属っぽい配色です。
アレンジすることで光沢と立体感をそのままに別の色にすることができます。
RGB(120 + 20 * y, 120 + 20 * y, 0)
RGB(120 + 20 * y, 60 + 10 * y, 0)
RGB(0, 0, 120 + 20 * y)
256 * (120 + 20 * y)
焼樹
x ^ 2 * y ^ 2 * 20
ジュリア集合に使うともっとキモくなります。
![f:id:Hassium277:20210320200952p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210320/20210320200952.png)
![f:id:Hassium277:20210320201034p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210320/20210320201034.png)
マンハッタン距離
発散判定の部分を以下のように書き換えると、同じ彩色関数でも見た目が変わります。
If x ^ 2 + y ^ 2 > 4 Then
↓
If Abs(x) + Abs(y) > 4 Then
RGB(120 + 20 * y, 120 + 20 * y, 120 + 20 * y)
RGB(x ^ 2 * 64, y ^ 2 * 64, 255)
x ^ 2 * y ^ 2 * 20
ジュリア集合と広義マンデルブロ集合の関係
Wikipediaの「マンデルブロ集合」のページに、こんな記述があります。
マンデルブロ集合は、 充填ジュリア集合に対する指標として提唱された集合である。
実際に普通のマンデルブロ集合とのジュリア集合の間には深い繋がりがあり、マンデルブロ集合を観察することでジュリア集合の形状をある程度制御できるようになります。
まず、の
をマンデルブロ集合の内側(黒い領域)から取るとジュリア集合は収束点*1が密集した領域(黒い領域)が発生し、外側から取ると収束点が疎らになります。
![f:id:Hassium277:20210319135515p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319135515.png)
![f:id:Hassium277:20210319135531p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319135531.png)
![f:id:Hassium277:20210319135731p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319135731.png)
![f:id:Hassium277:20210319135751p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319135751.png)
※実は前回の記事に載せたコードは「y軸は下向きがプラス」という仕様になっていて、画像が上下逆に生成されるようになっています。この記事でも同じコードを流用するので、0.6iや0.7iは原点より下側に表示されます。
また、をマンデルブロ集合内の縁の近くから取るとジュリア集合はギザギザに、縁から遠い点を取ると丸っこい形になります。
![f:id:Hassium277:20210319151918p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319151918.png)
![f:id:Hassium277:20210319151935p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319151935.png)
![f:id:Hassium277:20210319151823p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319151823.png)
![f:id:Hassium277:20210319151839p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319151839.png)
マンデルブロ集合は中央のハート形(「カージオイド」という名前があるようです)に無数の円が外接した形をしていますが、どの円から点を取るかによってジュリア集合の「枝分かれ」の数が変わります。
![f:id:Hassium277:20210319200502p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319200502.png)
![f:id:Hassium277:20210319200518p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319200518.png)
![f:id:Hassium277:20210319200622p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319200622.png)
![f:id:Hassium277:20210319200643p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319200643.png)
![f:id:Hassium277:20210319200719p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319200719.png)
![f:id:Hassium277:20210319200732p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319200732.png)
![f:id:Hassium277:20210319200850p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319200850.png)
![f:id:Hassium277:20210319200859p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319200859.png)
![f:id:Hassium277:20210319200938p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319200938.png)
![f:id:Hassium277:20210319200945p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319200945.png)
この他にも、以下のような特徴があります。
- 外側のもじゃもじゃした領域の近くの点を使うとジュリア集合ももじゃもじゃする
- 外側の縁ギリギリの点を使うと複雑で綺麗な画像になる
![f:id:Hassium277:20210319211946p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319211946.png)
![f:id:Hassium277:20210319211950p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319211950.png)
![f:id:Hassium277:20210319212142p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319212142.png)
![f:id:Hassium277:20210319212147p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319212147.png)
![f:id:Hassium277:20210319212757p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319212757.png)
![f:id:Hassium277:20210319212823p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319212823.png)
さて、ここまでの説明はの広義マンデルブロ集合とジュリア集合に限った話ですが、「広義マンデルブロ集合とジュリア集合の形状との間に関連性がある」というのは他のケースでもよくあることです。
そのため、面白いジュリア集合を生成するために広義マンデルブロ集合を元にしてパラメーターを決めるというのは有効な手段です。
ちなみにこれは今までの話とはあまり関係ない余談ですが、のマンデルブロ集合の細部をよく見ると
のジュリア集合とよく似た形が見つかることがあります。
右:z^2+cの広義マンデルブロ集合、c=1.749、2^17倍拡大
右:z^2+cのマンデルブロ集合、c=-1.769016+0.00268i、200000倍拡大
一般の広義マンデルブロ集合とジュリア集合の間にはこのような関係は見られませんが、「見た目の面白さ」に関して以下のような経験則があります。
- 広義マンデルブロ集合:パッと見の全体像はあまり面白くないが、細部を拡大すると色々な形があって面白い
- ジュリア集合:全体像が面白くても、細部を拡大しても全体像とあまり変わらず面白くない
Orbit trap
フラクタル図形の彩色アルゴリズムとして、「Orbit trap」という手法があります。
簡単に説明すると、こんな感じです。
(1) 基準となる点または線(トラップ)を決める
(2) を計算するとき、(1)で決めたトラップとの距離*2の最小値を記録する。
(3) (2)で記録した距離に応じて色を塗る
VBAでの実装は以下のようになります。
Sub f() Dim x, y, px, py, d As Double For a = 0 To 2000 For b = 0 To 2000 x = 0 y = 0 d = 8 '距離変数dを8に初期化 For c = 0 To 500 px = x py = y x = px ^ 2 - py ^ 2 + a / 500 - 2 y = 2 * px * py + b / 500 - 2 If d > x ^ 2 + y ^ 2 Then d = x ^ 2 + y ^ 2 '原点との距離がdより小さければ、dを更新 If x ^ 2 + y ^ 2 > 4 Then Exit For Next c Cells(b + 1, a + 1).Interior.Color = (1 - d / 8) ^ 99 * 255 'dに応じて色を塗る Next b Next a End Sub
これはトラップとして点を使ったものです。
Sub f() Dim x, y, px, py, d As Double For a = 0 To 2000 For b = 0 To 2000 x = 0 y = 0 d = 9 '距離変数dを9に初期化 For c = 0 To 500 px = x py = y x = px ^ 2 - py ^ 2 + a / 500 - 2 y = 2 * px * py + b / 500 - 2 If d > (x - 1) ^ 2 Then d = (x - 1) ^ 2 '直線x=1との距離がdより小さければ、dを更新 If x ^ 2 + y ^ 2 > 100 Then Exit For Next c Cells(b + 1, a + 1).Interior.Color = (1 - d / 9) ^ 99 * 255 'dに応じて色を塗る Next b Next a End Sub
こっちは直線をトラップにしたものです。
また、以下のように距離の計算を2回行うことで、2種類の図形をトラップにすることもできます。
Sub f() Dim x, y, px, py, d As Double For a = 0 To 2000 For b = 0 To 2000 x = 0 y = 0 d = 9 For c = 0 To 500 px = x py = y x = px ^ 2 - py ^ 2 + a / 500 - 2 y = 2 * px * py + b / 500 - 2 If d > (x - 1) ^ 2 Then d = (x - 1) ^ 2 'x=1との距離を計算 If d > (y - 1) ^ 2 Then d = (y - 1) ^ 2 'y=1との距離を計算 If x ^ 2 + y ^ 2 > 100 Then Exit For Next c Cells(b + 1, a + 1).Interior.Color = (1 - d / 9) ^ 99 * 255 Next b Next a End Sub
直線以外の一般の曲線に対して距離の計算を行うのは(多分)困難ですが、簡単な計算で求まる「距離もどき」で代用することができます。
Sub f() Dim x, y, px, py, d As Double For a = 0 To 2000 For b = 0 To 2000 x = 0 y = 0 d = 9 For c = 0 To 500 px = x py = y x = px ^ 2 - py ^ 2 + a / 500 - 2 y = 2 * px * py + b / 500 - 2 If d > (y - Sin(2 * x)) ^ 2 Then d = (y - Sin(2 * x)) ^ 2 If x ^ 2 + y ^ 2 > 100 Then Exit For Next c Cells(b + 1, a + 1).Interior.Color = (1 - d / 9) ^ 99 * 255 Next b Next a End Sub
これはのグラフをトラップとして、曲線との距離の代わりに
という値を使用しています。
一般に、という方程式で表せる曲線に対して
は距離の代わりとして使用可能です。
例えばのグラフは以下のようになりますが、
これをトラップにするとこうなります。
なお、所詮「距離もどき」なので上手くいかない場合もあります。
例えばのグラフは見事なハート型になるのですが、
これをトラップにしてもハート形は現れません。
「のグラフとの距離もどきが一定の点」のグラフを描いてみると、正しい距離とは大きく異なっていることが直感的にわかります。
上手くいくかどうかを式から判別する方法は私にはわからなかったので、グラフ描画ソフトで事前に確認するか、上手くいくことを祈りながら実行するしかありません。
それはさておき、コードの以下の部分を
Cells(b + 1, a + 1).Interior.Color = (1 - d / 9) ^ 99 * 255
Cells(b + 1, a + 1).Interior.Color = (1 - d / 9) ^ 99 * 511
こう書き換えると、
線が立体っぽくなります。
Orbit trapについて説明できることは以上なので、ここからはorbit trapで描画した画像を紹介します。
原点トラップ
![f:id:Hassium277:20210314221610p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210314/20210314221610.png)
![f:id:Hassium277:20210314225713p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210314/20210314225713.png)
点をトラップにしたものを疑似立体化すると、球体をくっつけたような見た目になるようです。
![f:id:Hassium277:20210314232340p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210314/20210314232340.png)
...と思いきや、様子の違うものがありました。
cを原点の近くにとると、球の縁の線が現れなくなるようです。何故?
ちなみに、ジュリア集合にorbit trapを使う場合、距離の計算式の位置を変える必要があります。
px = x py = y x = px ^ 2 - py ^ 2 + a / 500 - 2 y = 2 * px * py + b / 500 - 2 If d > x ^ 2 + y ^ 2 Then d = x ^ 2 + y ^ 2
これがマンデルブロ集合の計算に使ったコードで、xとyの値を更新した後で距離の計算をしています。
If d > x ^ 2 + y ^ 2 Then d = x ^ 2 + y ^ 2 px = x py = y x = px ^ 2 - py ^ 2 + 0.15 y = 2 * px * py
ジュリア集合の場合は、xとyの更新をする前に距離を計算するようにしてください。
大炎上?
![f:id:Hassium277:20210315213932p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210315/20210315213932.png)
前回の記事で「赤で塗ると炎っぽくなる」的なことを言いましたが、これはなんかもう「燃えてる」って感じではないですね。
あと全く関係ない話なんですが、先述の通り今まで紹介してきた画像は全て上下が反転しています。
ということで、バーニングシップフラクタルは以下の向きが正しい向きになります。
恐らくこの画像を見て「船っぽい」と思う人はあまりいないと思うので、バーニングシップという名前を付けた人も上下逆さまに描画したのかもしれませんね。
六芒星
![f:id:Hassium277:20210316201607p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210316/20210316201607.png)
は
を平行移動した図形で、
のグラフは3本の直線になります。
一般にという形の方程式のグラフは
と
のグラフを重ね合わせたものになります。
は
と書けるので、
、
、
という3本の直線になるというわけです。
なお、「複数のグラフを重ねた図形をトラップにした場合」と先述の「複数の図形をトラップにした場合」というのでは得られる図形が異なります。
右:x-1=0とy-1-0をトラップにした場合
ジュリア集合をこの方法で描画するとこんな感じになります。
![f:id:Hassium277:20210316222934p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210316/20210316222934.png)
![f:id:Hassium277:20210316233941p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210316/20210316233941.png)
![f:id:Hassium277:20210316234119p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210316/20210316234119.png)
![f:id:Hassium277:20210316234214p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210316/20210316234214.png)
最後の2枚ではではなく、左辺を3倍した
という式を使用しています。
のグラフは
と完全に同じですが、距離もどきの値は異なり結果として描画される星のサイズが小さくなります。
右:3(y-1)^3-9(y-1)(x-1)^2=0
成功例
![f:id:Hassium277:20210318182033p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210318/20210318182033.png)
![f:id:Hassium277:20210318205925p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210318/20210318205925.png)
![f:id:Hassium277:20210318210603p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210318/20210318210603.png)
先程「距離もどきが良い感じに機能しない例」としてハート形の曲線を上げましたが、という別の方程式を使えばハート形の曲線を描画することができます。
彩色関数を以下のように書き換えることで、背景を白にすることができます。
RGB(255, (1 - (1 - d / 9) ^ 99) * 255, (1 - (1 - d / 9) ^ 99) * 255)
あとこれは余談なんですが、の虚部が0のとき
のジュリア集合は(普通に描画すると)左右対称になります。
なのでorbit trapでトラップの位置を左右逆にすれば、生成される画像も左右逆になると思っていました。
ところが、実際に描画してみるとこうなりました。
![f:id:Hassium277:20210318182325p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210318/20210318182325.png)
![f:id:Hassium277:20210318182033p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210318/20210318182033.png)
また、の虚部が0でないときも原点を中心として点対称になりますが、トラップを180度回転させた場合も単純に回転させたものとは異なる画像になりました。
![f:id:Hassium277:20210318205853p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210318/20210318205853.png)
![f:id:Hassium277:20210318205925p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210318/20210318205925.png)
いろいろな広義マンデルブロ集合
ガッカリ定理
![f:id:Hassium277:20210321161745p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210321/20210321161745.png)
普通のマンデルブロ集合と異なる2次関数を使った広義マンデルブロ集合で、関数が違うので違う形になります。
・・・と思ったのですが、いろいろ実験しているうちに「普通のマンデルブロ集合の初期値を0.5に変えたやつ」とほぼ同じ形であることに気付きました。
これはと変形できることに起因していて、このことは以下のように一般化できるようです。
吸引力の変わるただ二つの不動点
![f:id:Hassium277:20210321192906p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210321/20210321192906.png)
は
のときに
が成り立つため、初期値を0にすると全ての点で収束してしまいます。
初期値を変えた場合は以下のようになります。
![f:id:Hassium277:20210321214821p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210321/20210321214821.png)
![f:id:Hassium277:20210321214854p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210321/20210321214854.png)
![f:id:Hassium277:20210321214916p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210321/20210321214916.png)
![f:id:Hassium277:20210321220409p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210321/20210321220409.png)
![f:id:Hassium277:20210321223337p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210321/20210321223337.png)
![f:id:Hassium277:20210321230917p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210321/20210321230917.png)
どうやらを0に近づけていっても、
がちょうど0であるときとは収束の仕方が同じにならないようです。
ちなみに、にすると
、
になり
のときと同じように全ての点で収束してしまいますが、
描画するとバグります。
計算誤差のせいでしょうか?
指数関数と三角関数
![f:id:Hassium277:20210322010013p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210322/20210322010013.png)
は、実部と虚部に分けると以下のようになります。
なお、発散判定は前回の記事やここまで使っていた方法と同様にの大きさで判定していますが、どうやらこの場合は正しい方法ではないようです。
普通のマンデルブロ集合では「が2を超えたら二度と原点付近には戻ってこない」という性質があるため発散が判定できていましたが、
では
が0でなければ
が負になる可能性があり、
が負になれば絶対値がどんなに大きくても一気に原点付近へ引き戻されます。
また、判定の上手くいかなさを裏付けるかのように、判定方法を変えると収束領域の形状が変化してしまいます。
![f:id:Hassium277:20210322010047p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210322/20210322010047.png)
![f:id:Hassium277:20210322142917p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210322/20210322142917.png)
指数関数といえば、複素数版の三角関数は指数関数を使って表すことができます。
![f:id:Hassium277:20210322161852p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210322/20210322161852.png)
![f:id:Hassium277:20210322161916p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210322/20210322161916.png)
はかなり独特な見た目でしたが、三角関数の方は多項式関数と形が似ている部分がありますね。
形が似ているといえば、こんなものを発見しました。
![f:id:Hassium277:20210322161938p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210322/20210322161938.png)
周りのわさわさした部分はさておき、中央には普通のマンデルブロ集合によく似た図形が見えます。
これはという関数そのものが2次関数と似ていることに由来しています。
![f:id:Hassium277:20210322195520p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210322/20210322195520.png)
のグラフは「重力下で両端を固定された鎖の形状を表す曲線」として知られていますが、昔は鎖の形は放物線になると考えられていたようです。
かの有名なガリレオ・ガリレイも勘違いしていたらしいので、ガリレオにの広義マンデルブロ集合を見せたら普通のマンデルブロ集合と勘違いするかもしれないですね。*3
対称性増やし
![f:id:Hassium277:20210328170603p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210328/20210328170603.png)
![f:id:Hassium277:20210328165306p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210328/20210328165306.png)
![f:id:Hassium277:20210328170053p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210328/20210328170053.png)
という形の関数において
を
に置き換えると、対応する広義マンデルブロ集合は
回回転対称になります。
元から(原点を中心として)回回転対称なものは、
への置換により
回回転対称になります。
![f:id:Hassium277:20210328210417p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210328/20210328210417.png)
![f:id:Hassium277:20210328210537p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210328/20210328210537.png)
![f:id:Hassium277:20210328220958p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210328/20210328220958.png)
に依存しない定数を足すことで、回転対称性は変わらずに形が変化します。
![f:id:Hassium277:20210328195813p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210328/20210328195813.png)
![f:id:Hassium277:20210328195849p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210328/20210328195849.png)
![f:id:Hassium277:20210328211218p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210328/20210328211218.png)
![f:id:Hassium277:20210328224257p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210328/20210328224257.png)
なお、定数じゃない項を足すと対称性は崩れます。
![f:id:Hassium277:20210328232638p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210328/20210328232638.png)
また、マルチブロ等の一部の広義マンデルブロ集合に限った話ですが、に
を直接掛けたりすることでも対称性が変わることがあります。
分数関数
![f:id:Hassium277:20210323132107p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210323/20210323132107.png)
はマルチブロ集合(
の広義マンデルブロ集合)の
の場合に相当しますが、前回の記事で紹介した
の場合とは大分様子が異なります。
例えばであれば
の絶対値が大きければ大きいほど発散しやすいため、広義マンデルブロ集合は原点付近に島状に分布していました。
一方では絶対値が大きければ大きいほど
の絶対値が小さくなるため、広義マンデルブロ集合は原点の周りに海状に分布するようです。
![f:id:Hassium277:20210323190045p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210323/20210323190045.png)
![f:id:Hassium277:20210323190142p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210323/20210323190142.png)
cが分母側に来る場合も、cの絶対値が大きいほど小さい値が足されることになり広義マンデルブロ集合が外側に広がっていくことがあります。
![f:id:Hassium277:20210322215758p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210322/20210322215758.png)
![f:id:Hassium277:20210322215846p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210322/20210322215846.png)
分数関数では、バーニングシップフラクタルで見られたようなノイズ状の発散領域がよく見られます。
![f:id:Hassium277:20210322215931p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210322/20210322215931.png)
この画像は計算回数不足(100回)により生じた偽りの姿で、の広義マンデルブロ集合の真の姿は以下のようになります。
![f:id:Hassium277:20210322220018p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210322/20210322220018.png)
指数関数と同様に、分数関数でも絶対値による収束判定が正常に機能しないことがあるようです。
例えばという関数を反復する場合、発散するときは「でかい数→小さい数→めっちゃでかい数→めっちゃ小さい数...」というサイクルで発散していきます。
しかし(c≠0)の場合、小さい数になった時にcが足されることで次の数が大きくならず、結果として計算途中で絶対値が大きくなっても発散が確定しません。
判定が正しくないのは「そういうものだ」と諦めて生成される画像を楽しめばいい話ですが、分数関数の場合はゼロ除算の問題も発生します。
少なくともExcelVBAでは、計算途中で分母がゼロになるとエラーが出て計算が止まります。
そのため、以下のように割り算の実行前にゼロ除算が発生しないかチェックする処理を挟む必要があります。
Sub f() Dim x, y, px, py As Double Dim o As Boolean For a = 0 To 2000 For b = 0 To 2000 x = a / 500 - 2 y = b / 500 - 2 o = True For c = 0 To 500 If x = 0 And y = 0 Then Cells(b + 1, a + 1).Interior.Color = RGB(cr(c * 9), cr(c * 9 + 85), cr(c * 9 + 170)) o = False Exit For Else px = x py = y x = (px ^ 2 - py ^ 2) / (px ^ 2 + py ^ 2) ^ 2 + a / 500 - 2 y = -2 * px * py / (px ^ 2 + py ^ 2) ^ 2 + b / 500 - 2 If x ^ 2 + y ^ 2 > 100 Then Cells(b + 1, a + 1).Interior.Color = RGB(cr(c * 9), cr(c * 9 + 85), cr(c * 9 + 170)) o = False Exit For End If End If Next c If o Then Cells(b + 1, a + 1).Interior.Color = 0 Next b Next a End Sub Function cr(ByVal c As Long) As Integer cr = (c Mod 256) * (255 - (c Mod 256)) / 65 End Function
初期値を0とすると確定でゼロ除算が発生するため、そういう場合は初期値をcや1に変更します。
ちなみに、分数関数でもゼロ除算対策が要らないときもあります。
![f:id:Hassium277:20210323222922p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210323/20210323222922.png)
例えばは
のときにゼロ除算が発生します。
いろいろなジュリア集合
多項式
![f:id:Hassium277:20210324003229p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324003229.png)
![f:id:Hassium277:20210324003104p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324003104.png)
![f:id:Hassium277:20210324003316p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324003316.png)
![f:id:Hassium277:20210324003355p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324003355.png)
![f:id:Hassium277:20210324003437p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324003437.png)
![f:id:Hassium277:20210324003553p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324003553.png)
![f:id:Hassium277:20210324003627p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324003627.png)
「ジュリア集合と広義マンデルブロ集合の関係」の項目で言及した「広義マンデルブロ集合の縁近くに点を取ると複雑で綺麗な画像になる」というのは他の関数でも大抵当てはまります。
なお、縁ギリギリの点を使ったときのジュリア集合に見られるカラフルな領域は発散が遅い領域なので、計算回数が少ないと違う見た目になることがあります。
![f:id:Hassium277:20210324175558p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324175558.png)
![f:id:Hassium277:20210324175647p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324175647.png)
※念のため言っておきますが、彩色関数は同じではありません。
指数関数と三角関数
![f:id:Hassium277:20210324175856p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324175856.png)
のジュリア集合には、広義マンデルブロ集合にもみられたヤシの木のような模様が現れます。
![f:id:Hassium277:20210324200715p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324200715.png)
多項式関数のジュリア集合では、「定数項に対応する点を広義マンデルブロ集合上で内側から外側へ移動させると、外側へ出た瞬間にジュリア集合の収束領域が一気に消滅する」という現象が見られました。
![f:id:Hassium277:20210324212509p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324212509.png)
![f:id:Hassium277:20210319212142p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319212142.png)
2cos(z)-1.208+0.02iという式もそういう意図で作ったものですが、予想に反して一部の領域は黒いまま残りました。
結果として、「湖面に浮いた得体のしれない油膜に群がる水棲昆虫」みたいなキモいビジュアルになりました。
分数関数
![f:id:Hassium277:20210324235721p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324235721.png)
![f:id:Hassium277:20210324235839p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210324/20210324235839.png)
![f:id:Hassium277:20210325140124p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210325/20210325140124.png)
![f:id:Hassium277:20210325140204p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210325/20210325140204.png)
多項式関数などと比べると、分数関数では同じ彩色関数を使っても全然違うカラーリングになることが少なからずあります。
![f:id:Hassium277:20210319211946p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210319/20210319211946.png)
![f:id:Hassium277:20210325140124p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210325/20210325140124.png)
![f:id:Hassium277:20210325141139p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210325/20210325141139.png)
![f:id:Hassium277:20210325141235p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210325/20210325141235.png)
上の2枚はという形の式から生成されていますが、
の広義マンデルブロ集合を見ても対応する位置には何もありません。
![f:id:Hassium277:20210325151603p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210325/20210325151603.png)
そもそも広義マンデルブロ集合の形状は初期値によって変わるので、「広義マンデルブロ集合がジュリア集合の特徴を表しているかどうか」は初期値に左右されます。
上のの広義マンデルブロ集合では初期値として(特に意味も無く)
を選びましたが、これが適切でなかったため対応関係が崩れたと考えられます。
なお、広義マンデルブロ集合における初期値について「を満たす点を初期値にするとよい」という説明を見たことがあるのですが、それでうまくいく理由が全く分からないので参考にはしてません。
非正則関数
今まで紹介してきたもののほとんどは、「複素数の関数としてきれいに表せる式」を使って定義されるものばかりでした。
数学的な言い方をすると、今まで紹介してきたものの定義式は「正則(微分可能)」であるといえます。
![f:id:Hassium277:20210228210311p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210228/20210228210311.png)
![f:id:Hassium277:20210315215126p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210315/20210315215126.png)
非正則な関数についても広義マンデルブロ集合やジュリア集合を定義することが可能で、正則なものでは見られないような特徴を持つものもあります。
というわけで、非正則関数によるフラクタル画像を紹介します。
トリコーン
![f:id:Hassium277:20210326200008p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326200008.png)
![f:id:Hassium277:20210326200103p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326200103.png)
![f:id:Hassium277:20210326200134p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326200134.png)
トリコーンのジュリア集合です。
のジュリア集合と雰囲気はよく似ていますが、探してみると意外と似た形は無いようです。
海の幸
![f:id:Hassium277:20210325233956p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210325/20210325233956.png)
![f:id:Hassium277:20210325233522p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210325/20210325233522.png)
![f:id:Hassium277:20210325233422p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210325/20210325233422.png)
![f:id:Hassium277:20210325233818p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210325/20210325233818.png)
![f:id:Hassium277:20210325233903p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210325/20210325233903.png)
バーニングシップフラクタルのジュリア集合です。
生物っぽい形が多いような気がします。
![f:id:Hassium277:20210327224715p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327224715.png)
指数関数にバーニングシップフラクタルと同じ変換を適用してみたところ、バーニングシップフラクタルとよく似た船っぽい形になりました。
![f:id:Hassium277:20210327224917p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327224917.png)
滑らかさ
![f:id:Hassium277:20210326202010p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326202010.png)
![f:id:Hassium277:20210326210518p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326210518.png)
![f:id:Hassium277:20210326210609p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326210609.png)
トリコーンやバーニングシップは正則っぽさや独自の特徴を持っていましたが、非正則関数によるフラクタル図形の多くには共通する特徴があります。
![f:id:Hassium277:20210326215040p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326215040.png)
![f:id:Hassium277:20210326215043p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326215043.png)
一言でいうと、非正則関数によるフラクタル図形の特徴は「滑らかさ」です。
普通のマンデルブロ集合では収束領域の縁は無限に細かいパーツが付いており、発散の遅い線状の領域も折れ曲がってたり分岐していたりして、滑らかな部分は(多分)存在しません。
一方で、のような非正則フラクタル図形には所々滑らかな部分が見られます。
ちなみにマンデルブロ集合には「マンデルブロ集合内での位置によってジュリア集合の枝分かれの数が変わる」という性質がありましたが、にも似た性質があります。
![f:id:Hassium277:20210326224557p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326224557.png)
![f:id:Hassium277:20210326224603p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326224603.png)
![f:id:Hassium277:20210326224748p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326224748.png)
![f:id:Hassium277:20210326224752p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326224752.png)
![f:id:Hassium277:20210326224823p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326224823.png)
![f:id:Hassium277:20210326224827p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326224827.png)
![f:id:Hassium277:20210326224859p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326224859.png)
![f:id:Hassium277:20210326224904p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210326/20210326224904.png)
ニセマンデルブロ集合
![f:id:Hassium277:20210327132735p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327132735.png)
![f:id:Hassium277:20210327133119p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327133119.png)
![f:id:Hassium277:20210327133219p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327133219.png)
の虚部の係数"2"を1に変えたものです。
式の形が似ているせいか、細部が普通のマンデルブロ集合に似ています。
係数を他の値にすると以下のようになります。
![f:id:Hassium277:20210327145841p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327145841.png)
![f:id:Hassium277:20210327152412p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327152412.png)
![f:id:Hassium277:20210327162706p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327162706.png)
![f:id:Hassium277:20210327162755p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327162755.png)
マンデルモドキ
![f:id:Hassium277:20210325205022p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210325/20210325205022.png)
これは以下のコードから生成される図形です。
Sub f() Dim x, y As Double Dim o As Boolean For a = 0 To 2000 For b = 0 To 2000 x = 0 y = 0 o = True For c = 0 To 500 x = x ^ 2 - y ^ 2 + a / 500 - 2 y = 2 * x * y + b / 500 - 2 If x ^ 2 + y ^ 2 > 100 Then Cells(b + 1, a + 1).Interior.Color = RGB(cr(c * 7), cr(c * 8), cr(c * 9)) o = False Exit For End If Next c If o Then Cells(b + 1, a + 1).Interior.Color = 0 Next b Next a End Sub Function cr(ByVal c As Long) As Integer cr = (c Mod 256) * (255 - (c Mod 256)) / 65 End Function
パッと見普通のマンデルブロ集合と全く同じに見えますが、正しいコードでは以下のように計算しています。
px = x py = y x = px ^ 2 - py ^ 2 + a / 500 - 2 y = 2 * px * py + b / 500 - 2
この計算は以下のように書き換えられます。
と
の計算には
と
の値を使っており、コード中ではpxとpyが
と
に対応しています。
一方、先程のコードでは前の項を保存せずにxとyを直接使用しているため、数式で書くと以下のようになります。
これをと
の式に書き直すと以下のようになります。
式の形が大きく異なるせいか、先程の偽マンデルブロ集合と比べて見た目の「非正則っぽさ」が強いように見えます。
ちなみにジュリア集合は以下のような感じになります。
![f:id:Hassium277:20210325220518p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210325/20210325220518.png)
![f:id:Hassium277:20210327173214p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327173214.png)
指魚
![f:id:Hassium277:20210327230020p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327230020.png)
指数関数から指数関数を取り除き、x^2に置き換えてみました。
式の形が似ているせいか、非正則っぽさが弱いようにみえます。
![f:id:Hassium277:20210327230802p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327230802.png)
![f:id:Hassium277:20210327230637p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327230637.png)
分複茶釜
![f:id:Hassium277:20210327173751p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327173751.png)
複素数に似た概念として、「分解型複素数」というものがあります。
複素数は実数に対してを満たす新しい数を追加してできた概念ですが、分解型複素数は
を満たす数を追加したものです。
orbit trap無しで描画したときのジュリア集合とマンデルブロ集合は以下のようになります。
![f:id:Hassium277:20210327184206p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327184206.png)
![f:id:Hassium277:20210327182858p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327182858.png)
全然面白く無いですね。
ちなみに、普通のマンデルブロ集合の式に絶対値関数を混ぜると、分解型複素数版っぽい部分が中途半端に混ざることがあります。
![f:id:Hassium277:20210327194239p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327194239.png)
![f:id:Hassium277:20210327184754p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327184754.png)
![f:id:Hassium277:20210327200832p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327200832.png)
![f:id:Hassium277:20210327202150p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327202150.png)
![f:id:Hassium277:20210327201032p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327201032.png)
分解型っぽくない部分はこんな感じです。
![f:id:Hassium277:20210327201336p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327201336.png)
![f:id:Hassium277:20210327201601p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210327/20210327201601.png)
折り返し変換
バーニングシップフラクタルの計算では2乗する前に実部と虚部の絶対値をとっていますが、このことは「実部と虚部の負の部分を折り返している」と解釈することができます。
このとき、の代わりに
とすることで「
の部分を折り返す」という操作を行うことができ、
の値を変えることでフラクタル図形の見た目を変えることができます。
![f:id:Hassium277:20210329155502p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210329/20210329155502.png)
![f:id:Hassium277:20210329161319p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210329/20210329161319.png)
![f:id:Hassium277:20210329164704p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210329/20210329164704.png)
上の3枚はそれぞれ「の領域を折り返す」「
の領域を折り返す」「両方折り返す」という操作をしています。
なお、普通のマンデルブロ集合の周りの領域をよく見るとトリコーンっぽい形が見えますが、
実は外側にデカいのがいます。
折り返し変換を適用したマンデルブロ集合を拡大すると、細部にも網目状の模様が現れていることがわかります。
![f:id:Hassium277:20210329191313p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210329/20210329191313.png)
ジュリア集合に対して折り返し変換を適用するとこうなります。
![f:id:Hassium277:20210329191728p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210329/20210329191728.png)
![f:id:Hassium277:20210329191830p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210329/20210329191830.png)
非正則関数によるフラクタル図形に対しても適用可能です。
![f:id:Hassium277:20210329204404p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210329/20210329204404.png)
![f:id:Hassium277:20210329195427p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210329/20210329195427.png)
何?
最初に説明したジュリア集合・広義マンデルブロ集合の定義に当てはまらないものをまとめて紹介します。
対称性増やし:ジュリア集合編
ジュリア集合の初期値を書き変えることで、広義マンデルブロ集合での対称性増やしと同じようなことができます。
Sub f() Dim x, y, px, py, cx, cy As Double Dim o As Double For a = 0 To 2000 For b = 0 To 2000 cx = a / 500 - 2 cy = b / 500 - 2 x = cx ^ 3 - 3 * cx * cy ^ 2 y = 3 * cx ^ 2 * cy - cy ^ 3 o = True For c = 0 To 500 px = x py = y x = px ^ 2 - py ^ 2 y = 2 * px * py + 0.7 If x ^ 2 + y ^ 2 > 100 Then Cells(b + 1, a + 1).Interior.Color = RGB(cr(c * 7), cr(c * 8), cr(c * 9)) o = False Exit For End If Next c If o Then Cells(b + 1, a + 1).Interior.Color = 0 Next b Next a End Sub Function cr(ByVal c As Long) As Integer cr = (c Mod 256) * (255 - (c Mod 256)) / 65 End Function
これは「、
という数列の絶対値が発散しない複素数
」を計算をすることを意味しています。
また、広義マンデルブロ集合のときと同様に、定数を足して対称性を崩さず変形させることができます。
![f:id:Hassium277:20210329222712p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210329/20210329222712.png)
第三の変数
![f:id:Hassium277:20210330161242p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210330/20210330161242.png)
広義マンデルブロ集合は2変数関数(と初期値)によって決まるフラクタル図形でしたが、3変数関数を使うようにもできます。
例えば上の画像のものでは、の
を計算に組み込んだ
という式を使っています。
![f:id:Hassium277:20210330013423p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210330/20210330013423.png)
![f:id:Hassium277:20210330021127p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210330/20210330021127.png)
三項漸化式を使うこともできます。
![f:id:Hassium277:20210330211745p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210330/20210330211745.png)
![f:id:Hassium277:20210330211919p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210330/20210330211919.png)
それぞれに対するジュリア集合っぽいものも考えることができます。
![f:id:Hassium277:20210330212053p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210330/20210330212053.png)
![f:id:Hassium277:20210330212140p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210330/20210330212140.png)
![f:id:Hassium277:20210330212319p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210330/20210330212319.png)
![f:id:Hassium277:20210330212350p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/H/Hassium277/20210330/20210330212350.png)