Mandelbrot分形光滑着色与查找连续阵列

时间:2015-05-01 16:19:15

标签: fractals mandelbrot

我知道有关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 ++中完成它,但我想自己构建它。

谢谢

1 个答案:

答案 0 :(得分:-1)

这篇文章非常完美!对于每个需要智能方法来创建连续色彩调色板的人来说,这是一个很好的见解。

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