28

ウィキペディアのマンデルブロ集合ページには、マンデルブロ集合の非常に美しい生成画像があります。

詳細マンデルブロ

また、独自のマンデルブロ アルゴリズムを実装しました。各ピクセルの計算に使用される反復回数が与えられ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与えられた反復でその勾配を計算する方法は?

(この質問はスムージングに関するものではありません。)

4

4 に答える 4

34

グラデーションはおそらく Ultra Fractal からのものです。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 次 (または類似のもの) である可能性があります。次の画像は、線形補間とモノトーン キュービック補間の違いを示しています。

線形グラデーションと立方体グラデーション

ご覧のとおり、キュービック補間の結果、より滑らかで「きれいな」グラデーションが得られます。単調キュービック補間を使用して、キュービック補間によって発生する可能性のある [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で、 は発散した反復回数、reim発散した座標、gradient.Scale256 で、colors上に示した事前計算されたグラデーション カラーの配列です。この場合、その長さは 2048 です。

于 2014-09-12T20:11:47.683 に答える
27

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;

結果は、私が探していたものとほとんど同じです。

マンデルブロー集合

:)

于 2013-05-12T08:30:44.660 に答える