2013-05-11 18 views
14

ウィキペディアのMandelbrotページにはマンデルブロセットの本当に美しい画像があります。wikipediaでマンデルブロを塗りつぶす色のグラデーションはどれですか?

Detail 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; 

私の結果はそのようになります。

enter image description here

私はかなり好きですが、どの色のグラデーションがWikipediaの画像に使われていますか?その勾配を与えられたnの反復でどのように計算するのですか?

(この質問はないについてsmoothingである。)

答えて

14

グラジエントはおそらくウルトラフラクタルからです。 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) 

[0、1]と色0〜255

にRGBでキャッチそれはない直線勾配であることです。ポイント間の補間は立方体(または同様のもの)です。あなたは、立方体がよりスムーズと「きれい」で見ることができるように

Linear vs cubic gradient

:画像の後には、線形とMonotone cubic補間の違いを示しています。私はモノトーン3次補間を使って、基本的な3次元によって引き起こされる色の範囲の「オーバーシュート」を避けました。補間された値が常に入力点(0〜255)の範囲内にある単調な3次関数です。

double size = Math.Sqrt(re * re + im * im); 
double smoothed = Math.Log(Math.Log(size) * ONE_OVER_LOG2) * ONE_OVER_LOG2; 
int colorI = (int)(Math.Sqrt(i + 1 - smoothed) * gradient.Scale + gradient.Shift) % colors.Length; 
Color color = colors[colorI]; 
iが発散反復回数、 reimが発散している座標である

gradient.Scale 256で、gradient.Shiftが0であり、colorsである:私は反復iに基づいて色を計算するためのコードを以下の使用

上に示した事前離散勾配のアレイ。その長さは通常2048です。

10

まあ、私は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; 

結果はかなり私が何であったかのように見えます探して:

Mandelbrot set

:)

1

私は彼らがUltra Fractalのデフォルトの色だと思います。評価版には多くのパラメータのソースが付属していますが、は、そのカラーマップを含むと考えています(フロントページのスクリーンショットから推測できない場合)。また、そのカラーマップを動的にスケーリングするロジックシーンごとに適切に調整します。

関連する問題