Я знаю, что уже задано несколько вопросов о методах плавной раскраски 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++, но я хотел бы сам создать его.
Спасибо
Так как ссылки на «другие вопросы»: вы видите ответ http://stackoverflow.com/a/1243788/2564301? – usr2564301
Да, и это говорит о том, что в решении должно быть построено непрерывное цветовое палитра, но оно не показывает, как это сделать. – user3154898
"..' smoothcolor' находится в интервале '(0, max_iter)'. Разделите 'smoothcolor' на' max_iter', чтобы получить значение от 0 до 1. " - 'max_iter' - это размер вашего массива. Деление на него состоит в том, чтобы заставить его в диапазон «0..1» для следующей функции - часть оттенка преобразования HSB-RGB. – usr2564301