您可以擁有的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
}
我們不能告訴你如何提高你的代碼,如果你不't顯示代碼;) – codeling
既然你給我們提供了很多關於顏色映射應該如何完成的信息,我會去看灰度......'R = G = B = value * 255/100'(提示:有一個問題隱藏在我的笑話中) – syam
聽起來像是地圖? –