我知道有关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
作为索引并在表格中查找。< / p>
然而我无法理解如何做到这一点。几乎每个人都使用函数在Java或C ++中完成它,但我想自己构建它。
谢谢
答案 0 :(得分:-1)
这篇文章非常完美!对于每个需要智能方法来创建连续色彩调色板的人来说,这是一个很好的见解。