2011-07-21 101 views
3

我需要一個projet從一個值中獲取顏色。 我解釋說,我有數據,每個數據必須用顏色表示。從數值中獲取顏色值

紅色表示最大值,藍色表示最小值,綠色表示中間值。一種熱圖。

所以,我需要一個函數返回正確的顏色。

我想是這樣的:

function datatocolor($min, $max, $value) 
    { 
     $half = (($min + $max)/2); 

     if ($value > $half) 
     { 
      $r = (255 * ($value+$min-$half))/$half; 
      $g = 255 - $r; 
      $b = 0; 
     } 
     else { 
      $b = (255 * ($half-$value+$min))/$half; 
      $g = 255 - $b; 
      $r = 0;   
     } 
     $color = array(intval($r), intval($g), intval($b)); 
     return $color; 
    } 

但是,我得到的紅色和藍色,綠色永遠......我嘗試了很多業務,我一定是愚蠢的,但我沒有找到合適的操作... 在此先感謝您的幫助!

+0

看看這個問題的第三個答案。 http://stackoverflow.com/questions/3407942/rgb-values-of-visible-spectrum – Matt

+0

感謝您的鏈接,我不知道TSV術語。 –

回答

2

我不是一個PHP專家,但據我所知,問題不在於此代碼塊。我測試在Java中你的算法只是可以肯定,它看起來是正確的:

public static void main(String[] args) { 
    int min = 0; 
    int max = 10; 
    int half = (min + max)/2; 

    int r, g, b; 

    // Cycling through the values for completeness' sake. 
    for (int value = 0; value <= 10; value++) { 
     if (value > half) { 
     r = (255 * (value + min - half))/half; 
     g = 255 - r; 
     b = 0; 
    } else { 
     b = (255 * (half - value + min))/half; 
     g = 255 - b; 
     r = 0; 
    } 
    System.out.println("Value: " + value + " - " + new Color(r, g, b)); 
} 

從這個輸出是你所期望的 - 以最小的純藍,純綠在中間,和純紅色在最大:

Value: 0 - java.awt.Color[r=0,g=0,b=255] 
Value: 1 - java.awt.Color[r=0,g=51,b=204] 
Value: 2 - java.awt.Color[r=0,g=102,b=153] 
Value: 3 - java.awt.Color[r=0,g=153,b=102] 
Value: 4 - java.awt.Color[r=0,g=204,b=51] 
Value: 5 - java.awt.Color[r=0,g=255,b=0] 
Value: 6 - java.awt.Color[r=51,g=204,b=0] 
Value: 7 - java.awt.Color[r=102,g=153,b=0] 
Value: 8 - java.awt.Color[r=153,g=102,b=0] 
Value: 9 - java.awt.Color[r=204,g=51,b=0] 
Value: 10 - java.awt.Color[r=255,g=0,b=0] 

根據您所提供的是什麼,這個問題似乎是無論是在你調用的功能,或者你方式使用數組的方式回報。

+0

感謝您的測試,它的工作是的,但我想要一個HSV的規模。這意味着:紅色 - >橙色 - >黃色 - >綠色 - >青色 - >藍色。我繼續尋找... :) –

+0

快速谷歌搜索'php hsv'產生了一些RGB和HSV色彩空間之間的轉換函數。 –

+0

是的,我發現要在HSV中轉換的功能。但是,我想我需要將我的值轉換爲HSV格式,然後轉換爲RGB以獲得正確的梯度... –