ウィキペディアの Mandelbrotセット ページには、Mandelbrotセットの非常に美しい生成画像があります。
また、自分のマンデルブロアルゴリズムも実装しました。 n
が各ピクセルの計算に使用される反復回数であるとすると、黒から緑、そして白(C++とQt 5.0の場合)まで、かなり単純な色を付けます。
QColor mapping(Qt::white);
if (n <= MAX_ITERATIONS){
double quotient = (double) n / (double) MAX_ITERATIONS;
double color = _clamp(0.f, 1.f, quotient);
if (quotient > 0.5) {
// Close to the mandelbrot set the color changes from green to white
mapping.setRgbF(color, 1.f, color);
}
else {
// Far away it changes from black to green
mapping.setRgbF(0.f, color, 0.f);
}
}
return mapping;
私の結果はそのようになります:
もうかなり気に入っていますが、ウィキペディアの画像にはどの色のグラデーションが使用されていますか?与えられたn
の反復でその勾配を計算する方法は?
(この質問は スムージング についてではありませんではありません。)
勾配はおそらくウルトラフラクタルからのものです。 5つの制御点によって定義されます。
Position = 0.0 Color = ( 0, 7, 100)
Position = 0.16 Color = ( 32, 107, 203)
Position = 0.42 Color = (237, 255, 255)
Position = 0.6425 Color = (255, 170, 0)
Position = 0.8575 Color = ( 0, 2, 0)
ここで、Position
は[0、1)の範囲にあり、Color
は[0、255]の範囲にあるRGBです。
問題は、色が線形補間されないことです。色の補間はおそらく3次(または同様の)ものです。次の画像は、線形補間と 単調立方 補間の違いを示しています。
ご覧のとおり、3次補間の結果はより滑らかで「きれい」なグラデーションになります。単調キュービック補間を使用して、キュービック補間によって引き起こされる可能性がある[0、255]色範囲の「オーバーシュート」を回避しました。単調キュービックは、補間された値が常に入力ポイントの範囲内にあることを保証します。
次のコードを使用して、反復i
に基づいて色を計算します。
double smoothed = Math.Log2(Math.Log2(re * re + im * im) / 2); // log_2(log_2(|p|))
int colorI = (int)(Math.Sqrt(i + 10 - smoothed) * gradient.Scale) % colors.Length;
Color color = colors[colorI];
ここで、i
は分岐した反復数、re
およびim
は分岐した座標、gradient.Scale
は256であり、colors
は、上記の事前計算されたグラデーションカラーを含む配列です。この場合、その長さは2048です。
ええと、私はPhotoshopスポイトを使用して、ウィキペディアで使用されている色についてリバースエンジニアリングを行いました。このグラデーションには16色があります。
R G B
66 30 15 # brown 3
25 7 26 # dark violett
9 1 47 # darkest blue
4 4 73 # blue 5
0 7 100 # blue 4
12 44 138 # blue 3
24 82 177 # blue 2
57 125 209 # blue 1
134 181 229 # blue 0
211 236 248 # lightest blue
241 233 191 # lightest yellow
248 201 95 # light yellow
255 170 0 # dirty yellow
204 128 0 # brown 0
153 87 0 # brown 1
106 52 3 # brown 2
モジュロとQColor配列を使用するだけで、グラデーションのすべての色を反復処理できます。
if (n < MAX_ITERATIONS && n > 0) {
int i = n % 16;
QColor mapping[16];
mapping[0].setRgb(66, 30, 15);
mapping[1].setRgb(25, 7, 26);
mapping[2].setRgb(9, 1, 47);
mapping[3].setRgb(4, 4, 73);
mapping[4].setRgb(0, 7, 100);
mapping[5].setRgb(12, 44, 138);
mapping[6].setRgb(24, 82, 177);
mapping[7].setRgb(57, 125, 209);
mapping[8].setRgb(134, 181, 229);
mapping[9].setRgb(211, 236, 248);
mapping[10].setRgb(241, 233, 191);
mapping[11].setRgb(248, 201, 95);
mapping[12].setRgb(255, 170, 0);
mapping[13].setRgb(204, 128, 0);
mapping[14].setRgb(153, 87, 0);
mapping[15].setRgb(106, 52, 3);
return mapping[i];
}
else return Qt::black;
結果は私が探していたものとほとんど同じです:
:)
ltra Fractal のデフォルトの色だと思います。評価版には、多くのパラメーターのソースと、そのカラーマップを含むthinkが付属しています(スクリーンショットから推測できない場合)。フロントページ)、およびおそらく各シーンに適切にそのカラーマップを動的にスケーリングする背後にあるロジックも。