2013-05-11 2 views
14

На странице wikipedia Mandelbrot есть действительно красивые сгенерированные изображения набора Мандельброта.Какой градиент цвета используется для окраски мандельброта в википедии?

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

Мне это уже нравится, но какой градиент цвета используется для изображений в Википедии? Как вычислить этот градиент с заданными n итераций?

(Этот вопрос не о smoothing.)

ответ

14

Градиент, вероятно, относится к 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) 

, где позиция находится в диапазоне [0, 1] и цвет RGB от 0 до 255.

Загвоздка в том, что она не линейный градиент. Интерполяция между точками кубическая (или нечто подобное). Следующее изображение показывает различие между линейным и Monotone cubic интерполяцией:

Linear vs cubic gradient

Как вы можете видеть, что кубическое гораздо более гладкая и «красивее». Я использовал монотонную кубическую интерполяцию, чтобы избежать «перерегулирования» цветового диапазона, который может быть вызван базовой кубической. Монотонные кубические антракты, в которых интерполированные значения всегда находятся в диапазоне входных точек (0-255).

Я использую следующий код для вычисления цвета на основе итерации i:

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 это расходились номер итерации, re и im являются расходились координаты, gradient.Scale 256, gradient.Shift является 0 и colors является массив с предварительно дискретизированным градиентом, показанный выше. Его длина обычно составляет 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. Оценочная версия поставляется с источником для множества параметров, а I считает, который включает в себя эту карту цветов (если вы не можете сделать вывод из скриншота на первой странице) и, возможно, также логику динамического масштабирования этой цветовой карты соответственно для каждой сцены.

 Смежные вопросы

  • Нет связанных вопросов^_^