2015-05-01 23 views
3

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

回答

-1

本文只是完美!對於需要智能方式創建顏色連續調色板的每個人來說,這是一個很好的見解。

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

+0

「網絡上存在某種資源可以解釋所有事情」並不奇怪。但是,對於計算器而言,強烈建議不要使用「僅鏈接答案」(並且,出於這個原因,您的答案很快就會被刪除的可能性不大)。你應該提供一些上下文並解釋你如何解決它(當然,不要剽竊鏈接內容) – Marco13