【问题标题】:Calculate a color which sits between 2 colors?计算一种介于两种颜色之间的颜色?
【发布时间】:2013-08-02 13:30:45
【问题描述】:

我需要可视化一个数字列表,这个列表每 x 分钟生成一次。我目前使用单行,旁边有数字。这可以正常工作,但是在进行实时分析时会变得很难看。

经过一番思考,我想出了对数字进行颜色编码的想法,一个大的负数是红色,一个大的正数是绿色,一个正常的正数是浅绿色,比正常数字略大的位于绿色和浅绿色。

为了说明,我做了一张图片:

我的问题。例如,如果我们有:

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

如何计算代表 25 的颜色?

【问题讨论】:

  • 这取决于,你希望它遵循什么样的曲线?
  • 如何使用 RGB、CMYK 或 HSV 表示颜色?
  • 您是使用 RGB(或其他颜色编码)表示颜色还是只是一种约定?

标签: java algorithm colors


【解决方案1】:

我认为这个现有问题应该给你一些接近你正在寻找的东西:

Generate colors between red and green for a power meter?

【讨论】:

  • 你不能应用它,因为绿色和红色之间是黄色的。所以这更像是一个评论而不是答案。
  • @Vash 为什么可以,如果他也将饱和度更改为1.8*Math.abs(power-0.5)
【解决方案2】:

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

【讨论】:

  • 感谢您的建议,这看起来是个不错的解决方案,我明天试试。也向丹尼和克里斯竖起大拇指!
【解决方案3】:

我写了一些非常相似的东西,也许这会有所帮助。已经有一段时间了,所以我不记得我究竟为什么要这样做,但我尝试了每种颜色的几种变体(例如深红色和浅红色)。根据所需的颜色数量,我会从光谱的一端(色调)附近开始,然后“间隙”到光谱的另一端,其中间隙取决于我需要多少颜色。所以,如果你需要 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;
  }
}

【讨论】:

    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 2012-11-27
    • 2023-03-14
    • 2019-12-07
    • 2015-01-17
    • 2018-01-30
    • 2011-05-23
    • 1970-01-01
    相关资源
    最近更新 更多