2013-08-01 83 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; 
    } 
}