我知道曼德爾布羅分形光滑着色技術已經被問(並回答)的幾個問題。然而他們沒有詳細介紹瞭如何建立的連續顏色數組以純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轉換的Hue部分。 – usr2564301