2015-05-01 8 views
3

Я знаю, что уже задано несколько вопросов о методах плавной раскраски mandelbrot, которые были запрошены (и ответили). Однако ни один из них не знает, как построить массив непрерывных цветов в обычном C.Мандельброт фрактальная гладкая окраска с непрерывным непрерывным массивом

Я читал подробно о сглаживании цветовых алгоритмов, и я могу рассчитать непрерывное количество итераций с помощью основного алгоритма времени эвакуации. В основном я использую этот номер, чтобы вручную установить компоненты reba цвета. (Пожалуйста, не предлагайте мне использовать OPENGL или подобное ... Я просто хочу сделать это вручную, потому что я хочу это понять).

вот мой код:

#define W 800 //window width 
#define H 800 //window height 
#define MAX_ITERS 1000 // number of iterations 

union color_u 
{ 
    unsigned int num;  //color as an integer 
    unsigned char comp[4]; //color as components (brga) -> beacause of the endianness 
}; 



unsigned int    getColor(int i, double *z) 
{ 
    double k; 
    color_u color; 

    k = i + 1 - log(log(sqrt(z[R] * z[R] + z[I] * z[I])))/log(2); 
    k /= MAX_ITERS; 
    if (i > 700) 
    { 
     color.comp[0] = (unsigned char) (255.0 * k); //blue 
     color.comp[1] = (unsigned char) 0;   //green 
     color.comp[2] = (unsigned char) 0;   //red 
     color.comp[3] = (unsigned char) 0;   //alpha 
    } 
    else 
    { 
     color.comp[0] = (unsigned char) 0;   //blue 
     color.comp[1] = (unsigned char) 0;   //green 
     color.comp[2] = (unsigned char) (255.0 * k) //red 
     color.comp[3] = (unsigned char) 0;   //alpha 
    } 
    return color.num; 
} 
void  mandelbrot(void) 
{ 
    int i; 
    double z[2]; 
    double c[2]; 
    double tmp; 

    c[R] = fr->x + (pixel[X] - W)/(e->zoom * W); 
    c[I] = fr->y + (pixel[Y] - H)/(e->zoom * H); 
    z[R] = 0; 
    z[I] = 0; 

    i = 0; 
    while (z[R] * z[R] + z[I] * z[I] < 4 && ++i < MAX_ITERS) 
    { 
     tmp = z[R] * z[R] - z[I] * z[I] + c[R]; 
     z[I] = 2 * z[R] * z[I] + c[I]; 
     z[R] = tmp; 
    } 
    if (i < MAX_ITERS) 
    { 
     draw_pixel(getColor(i, z)); 
    } 
} 

Результат просто крут, но не удивительный.

Теперь я хотел бы построить предварительно рассчитанный массив непрерывных цветов, размер которого равен MAX_ITERATIONS ... для использования моего i в качестве индекса и поиска в таблице.

Однако я не могу понять, как это сделать. Почти все используют функции, чтобы сделать это на Java или C++, но я хотел бы сам создать его.

Спасибо

+0

Так как ссылки на «другие вопросы»: вы видите ответ http://stackoverflow.com/a/1243788/2564301? – usr2564301

+0

Да, и это говорит о том, что в решении должно быть построено непрерывное цветовое палитра, но оно не показывает, как это сделать. – user3154898

+0

"..' smoothcolor' находится в интервале '(0, max_iter)'. Разделите 'smoothcolor' на' max_iter', чтобы получить значение от 0 до 1. " - 'max_iter' - это размер вашего массива. Деление на него состоит в том, чтобы заставить его в диапазон «0..1» для следующей функции - часть оттенка преобразования HSB-RGB. – usr2564301

ответ

-1

Эта статья просто идеальна! Это отличная идея для всех, кто нуждается в умном способе для создания постоянной палитры цветов.

http://krazydad.com/tutorials/makecolors.php

+0

Не удивительно, что «существует какой-то ресурс где-то в Интернете, который объясняет все». Но «Link-only-answers» сильно не приветствуются в stackoverflow (и вряд ли ваш ответ скоро будет удален по этой причине). Вы должны указать некоторый контекст и объяснить, как вы его решили (без плагиата содержимого ссылки, конечно ...) – Marco13