2013-08-01 125 views
3

我需要可視化一個數字列表,這個列表每x分鐘產生一次。我目前使用一側帶有數字的單行。這可以正常工作,但在進行實時分析時,它會變得很難看清楚。計算兩種顏色之間的顏色?

想了一下我想出了顏色編碼數字的想法,一個大的負數是紅色的,一個大的正數是綠色的,一個正常的正數是淡綠色的,比正常數字略大一點和淺綠色。

爲了說明這我犯了一個形象:

enter image description here

我的問題。例如,如果我們有:

50: Color.green 
0: Color.white 
-50: Color.red 

如何計算代表25的顏色?

+0

這取決於你想要遵循什麼樣的曲線? – harold

+0

如何使用RGB,CMYK或HSV表示顏色? –

+0

您是使用RGB(或其他顏色編碼)表示顏色還是僅僅是一種約定? – araknoid

回答

5

對於red <--> white <--> green之間嚴格的線性表示,

import java.awt.Color; 

/* Define the MAXIMUM saturation of RED and GREEN shades 
* Range (0-255) 
*/ 
final int RED_MAX = 255; 
final int GREEN_MAX = 255; 

/* input val varies from -MAX to MAX */ 

/* output valColor varies from 
* -MAX = red 
*  ^
*   | 
*   v 
* 0 = white 
*  ^
*   | 
*   v 
* MAX = green 
*/ 

/* Normalised normVal varies from -255 to 255 */ 
normVal = (val*255)/MAX 

if(val < 0) { 
    /* Make it red-ish */ 
    valColor = new Color(RED_MAX, 
          255 + normVal, 
          255 + normVal); 
} else if (val > 0) { 
    /* Make it green-ish */ 
    valColor = new Color(255 - normVal), 
          GREEN_MAX, 
          255 - normVal); 
} else { 
    /* Absolute White */ 
    valColor = new Color(255, 255, 255); 
} 
+0

感謝您的建議,它看起來是一個很好的解決方案,我明天會試一試。還讚揚丹尼和克里斯! – TinusSky

1

我認爲這個存在的問題應該給你一些接近你正在尋找:

Generate colors between red and green for a power meter?

+0

由於綠色和紅色之間爲黃色,因此不能應用該選項。所以它更多的是評論而不是回答。 –

+0

@Vash爲什麼他可以,如果他也會改變飽和度爲1.8 * Math.abs(power-0.5)'。 – Vesper

1

我寫了一些非常相似,也許這會有所幫助。這已經有一段時間了,所以我不記得我爲什麼做了我所做的事情,但我嘗試了各種顏色的變體(例如深紅色和淺紅色)。根據所需的顏色數量,我會從光譜的一端(色調)和「間隙」開始,直到光譜的另一端,其間隙取決於我需要的顏色數量。所以,如果你需要10種獨特的顏色,它會將光譜分成1/5秒,並在每個第5個顏色中選擇一個明暗。

不知道這是否合理,但希望它有幫助。

import java.awt.Color; 
import java.util.ArrayList; 
import java.util.List; 

public class ColorPicker 
{ 
    public static List<Color> chooseDistinguishableColors(int numberOfColors) 
    { 
    List<Color> colors = new ArrayList<>(); 
    float gap = 1.0f/(float) ((numberOfColors/2) + (numberOfColors % 2)); 
    for (int i = 0; colors.size() < numberOfColors; i++) 
    { 
     float hue = i * gap; 
     colors.add(new Color(Color.HSBtoRGB(hue, 1.0f, 0.90f))); 
     colors.add(new Color(Color.HSBtoRGB(hue, 1.0f, 0.65f))); 
    } 
    return colors; 
    } 
}