2013-08-23 85 views
2

我有大約1000個浮點值(0.0,100.0),我想將這些值映射爲顏色(RGB)。我到目前爲止所做的是創建一個具有1000色(RGB)值的色彩地圖,使用浮點值爲色彩地圖建立索引並獲取RGB值。將浮點值(0.0,100.0)映射到RGB

但問題是,我失去了精度,因爲我將浮點值轉換爲int,然後將它們用作我的色彩圖的索引。什麼是最好的辦法做到這一點漂浮到rgb轉換?

編輯:

color color_list[100]; 
float float_values[1000] 
for(i = 0 to 999) 
{ 
    int colormap_idx = float_values[i]; // Note that the float is converted into an int 
    color current_color = color_list[colormap_idx]; 
} 
+2

我們不能告訴你如何提高你的代碼,如果你不't顯示代碼;) – codeling

+2

既然你給我們提供了很多關於顏色映射應該如何完成的信息,我會去看灰度......'R = G = B = value * 255/100'(提示:有一個問題隱藏在我的笑話中) – syam

+0

聽起來像是地圖? –

回答

2

您可以擁有的RGB值的總數是256^3。如果你可以利用所有這些,那將是非常好的,但有時很難想出一個很好的直觀映射。由於總共可能有256^4個浮點數(超過可能的RGB值),所以無論您做什麼,都會失去精度,但仍然可以做得更好,比現在好得多。

我並不確切知道你在用預定義的顏色映射表做什麼,但考慮僅定義幾個中間顏色,它們對應於幾個中間浮點值並插值每個輸入浮點值。在下面的代碼中,fsample和csample是你的對應點。例如:

fsample[0] = 0.0 -> csample[0] = (0, 0, 0) 
fsample[1] = 0.25 -> csample[1] = (0, 0, 100) 
fsample[2] = 0.5 -> csample[2] = (0, 170, 170) 
fsample[3] = 0.75 -> csample[3] = (170, 170, 0) 
fsample[4] = 1.0 -> csample[4] = (255, 255, 255) 

這將允許您以彌補與花車RGB空間多了很多地,允許更高的精度轉換,同時還爲您提供了一些動力,以靈活定義的中間色。這是將灰度轉換爲彩色的相當普遍的方法。

有您可以申請這個代碼進行一些優化和錯誤檢查,但我離開它未優化爲清楚起見:

int N = float_values.size(); 
color colormap[N]; 
for(i = 0 to N) 
{ 
    colormap[i] = RGBFromFloat(float_values[i], fsample, csample, num_samples); 
} 



color RGBFromFloat(float in, float fsample[], float csample[], num_samples) 
{ 
    color out; 

    // find the interval that the input 'in' lies in 
    // this is a simple search on an ordered array... 
    // consider replacing with a better algorithm for a large number of samples 
    for(i = 0 to num_samples-1) 
    { 
     if(fsample[i] =< in && in < fsample[i+1]) 
     { 
      out = interpolate(fsample[i], fsample[i+1], csample[i], csample[i+1], in);  
      break; 
     } 
    } 
    return color; 
} 

color interpolate(float flow, float fhigh, color clow, color chigh, float in) 
{ 
    float t = (in-flow)/(fhigh-flow); 
    return clow*(1 - t) + chigh*t 
} 
+0

做'fsample []'值必須歸一化嗎? –

+0

在這個例子中,不,因爲我們在計算't'時正常化。但是,使用公式clow *(1-t)+ chigh * t時,必須對「t」進行歸一化。 –

1

我不知道這是最好方法(因爲你給了我們沒有最優的標準),但如果通過「我失去了精確」你的意思是一旦轉換成int,你只需要最多100種不同的顏色組合,那麼你可以這樣做:

// this code is C99 

#define MAX_FLOAT_VAL 100.0 
#define N_COLORS 2000 
#define N_FLOAT_SAMPLES 1000 

color color_list[N_COLORS]; 
float float_values[N_FLOAT_SAMPLES]; 

// the following loop must be placed in some function 
for(int i = 0; i < N_FLOAT_SAMPLES; i++) 
{ 
    // the following assignment will map 
    // linearly a float in the range [0 ... MAX_FLOAT_VAL] 
    // into an int in the range [0 ... (N_COLORS-1)] 
    int colormap_idx = (float_values[i]/MAX_FLOAT_VAL) * (N_COLORS - 1); 
    color current_color = color_list[colormap_idx]; 
    // ... do something with current_color ... 
} 

當然你還是要產生與蘇中color_list條目可行的算法(我建議不要這樣做:-)。這是一個完全不同的問題,因爲它會涉及更多的「自由度」,因爲您嘗試將1-D空間(值爲colormap_idx)映射到3-D空間(所有可能的RGB三元組的集合)。

P.S:您似乎已經提醒我需要爲Mandelbrot集的圖形表示着色分形所需的計算的要求。

希望這會有所幫助。