计算两种颜色之间的中间色?

4

我需要可视化一个数字列表,这个列表每 x 分钟生成一次。我目前使用一条带有数字的单行。这样做是正确的,但是在进行实时分析时会对眼睛产生困扰。

经过一番思考,我想到了给这些数字上色的想法:大的负数为红色,大的正数为绿色,普通的正数为浅绿色,略大于普通数字的数字则介于绿色和浅绿色之间。

我制作了一张图片来说明:

enter image description here

我的问题是:如果我们有:

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

我该如何计算代表25的颜色?

这要看你想让它遵循什么样的曲线了。 - harold
你如何使用RGB、CMYK或HSV表示颜色? - Damian Leszczyński - Vash
你是用RGB(或其他颜色编码)来表示颜色,还是这只是一种约定? - araknoid
3个回答

6

为了在红、白、绿三者之间实现严格的线性表示,

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 );
}

谢谢你的建议,看起来是个不错的解决方案,我明天会试一下。同时也要给Danny和Chris点赞! - TinusSky

1
我写了一些类似的东西,也许这会有所帮助。已经过了一段时间,所以我不记得我为什么要做我所做的事情,但我尝试了每种颜色的几个变体(例如深红色和浅红色)。根据所需颜色的数量,我会从光谱的一端开始(色调),并向另一端“间隔”,其中间隔取决于我需要多少颜色。因此,如果您需要10种独特的颜色,它会将光谱分成五分之一,并选择每个五分之一的浅色和深色。希望这有帮助,不确定是否有意义。
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;
  }
}

1

你不能将它应用,因为绿色和红色之间是黄色。所以这更像是一条评论而不是答案。 - Damian Leszczyński - Vash
@Vash,是的,他可以这样做,如果他还将饱和度改为1.8*Math.abs(power-0.5) - Vesper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接