2008-10-03 77 views
14

我試圖在窗體上看到一些值。它們的取值範圍是0到200,我希望0左右的是綠色,當它們到200時變爲鮮紅色。顏色縮放功能

基本上,函數應該根據輸入的值返回顏色。有任何想法嗎 ?

回答

17

基本上,對於兩個值之間平滑過渡的一般方法是下面的函數:

function transition(value, maximum, start_point, end_point): 
    return start_point + (end_point - start_point)*value/maximum 

即給定的,可以定義確實爲三元組(RGB,HSV等)轉換的功能。

function transition3(value, maximum, (s1, s2, s3), (e1, e2, e3)): 
    r1= transition(value, maximum, s1, e1) 
    r2= transition(value, maximum, s2, e2) 
    r3= transition(value, maximum, s3, e3) 
    return (r1, r2, r3) 

假設你有RGB色彩爲小號ē三胞胎,你可以使用transition3功能原樣。然而,通過HSV色彩空間會產生更多的「自然」轉換。因此,考慮到轉換功能(從Python colorsys模塊無恥地竊取並轉換爲僞代碼:):

function rgb_to_hsv(r, g, b): 
    maxc= max(r, g, b) 
    minc= min(r, g, b) 
    v= maxc 
    if minc == maxc then return (0, 0, v) 
    diff= maxc - minc 
    s= diff/maxc 
    rc= (maxc - r)/diff 
    gc= (maxc - g)/diff 
    bc= (maxc - b)/diff 
    if r == maxc then 
     h= bc - gc 
    else if g == maxc then 
     h= 2.0 + rc - bc 
    else 
     h = 4.0 + gc - rc 
    h = (h/6.0) % 1.0 //comment: this calculates only the fractional part of h/6 
    return (h, s, v) 

function hsv_to_rgb(h, s, v): 
    if s == 0.0 then return (v, v, v) 
    i= int(floor(h*6.0)) //comment: floor() should drop the fractional part 
    f= (h*6.0) - i 
    p= v*(1.0 - s) 
    q= v*(1.0 - s*f) 
    t= v*(1.0 - s*(1.0 - f)) 
    if i mod 6 == 0 then return v, t, p 
    if i == 1 then return q, v, p 
    if i == 2 then return p, v, t 
    if i == 3 then return p, q, v 
    if i == 4 then return t, p, v 
    if i == 5 then return v, p, q 
    //comment: 0 <= i <= 6, so we never come here 

,你可以有代碼如下:

start_triplet= rgb_to_hsv(0, 255, 0) //comment: green converted to HSV 
end_triplet= rgb_to_hsv(255, 0, 0) //comment: accordingly for red 

maximum= 200 

… //comment: value is defined somewhere here 

rgb_triplet_to_display= hsv_to_rgb(transition3(value, maximum, start_triplet, end_triplet)) 
7
red = (float)val/200 * 255; 

green = (float)(200 - val)/200 * 255; 

blue = 0; 

return red << 16 + green << 8 + blue; 
+0

這將使中點(100)puke green:rgb(127,127,0)。你會希望你的中點是一個明亮的黃色或橙色。見:http://stackoverflow.com/questions/168838/color-scaling-function#168980 – 2008-10-03 21:30:55

+1

我同意這一點,它不會看起來不錯,但我是一個編碼器和中點不是規範的一部分;) – 2008-10-03 21:36:02

1

翻翻this wikipedia article我個人會選擇一個路徑通過一個色彩空間,和值映射到該路徑。

但這是一個直接的功能。我認爲你可能更適合使用可以給你Hex的快速顏色找到的javascript顏色選擇器,並且可以存儲十六進制。

3

找一個你喜歡,你喜歡(RGB2 =#FF0000,例如),然後綠色(RGB 1 =#00FF00,EG)和紅色計算這樣

R = R1 * (200-i)/200 + R2 * i/200 
G = G1 * (200-i)/200 + G2 * i/200 
B = B1 * (200-i)/200 + B2 * i/200 
2

爲了獲得最佳的控制和顏色準確的效果,你應該使用HSV色彩空間。使用HSV,您可以輕鬆地將色調,飽和度和/或亮度分開調整。然後,您將轉換爲RGB。

7

你不說在什麼環境下你這樣做。如果你能HSV colors工作,這將是很容易通過設置S = 100 V = 100,並通過確定H至事:

H = 0.4 * value + 120 

Converting from HSV to RGB也相當容易。

[編輯]注意:與其他一些建議的解決方案相比,這將改變顏色綠色 - >黃色 - >橙色 - >紅色。

0

如果您使用紅色線性斜坡和綠色價值,如彼得帕克建議,價值100的顏色基本上是puke green(127,127,0)。理想情況下,您希望它在該中點處是明亮的橙色或黃色。對於這一點,你可以使用:

Red = max(value/100, 1) * 255 
Green = (1 - max(value/100, 1)) * 255 
Blue = 0 
2

在@ tzot代碼擴展...您還可以設置一箇中間點在起點和終點,這可能是有用之間,如果你想有一個「過渡色「!

//comment: s = start_triplet, m = mid_triplet, e = end_triplet 
function transition3midpoint = (value, maximum, s, m, e): 
    mid = maximum/2 
    if value < mid 
     return transition3(value, mid, s, m) 
    else 
     return transition3(value - mid, mid, m, e)