在Java中更改颜色的亮度/饱和度

时间:2020-07-09 08:24:06

标签: java swing colors

当前,我正在使用javax.swing进行模拟项目,并且我想根据其食物价值在地图上绘制“草”。我的食物价值是0 <1之间的两倍,我想随着它变大而变得更亮。我一直在阅读有关HSB / HSV的信息,但无法弄清楚它的工作方式/语法。对这个问题有什么好的解决方案?或者有人可以将我引导到一个教程不错的地方?

class Grass{

    private void setColor(){
        grassColor = new Color(107, 142, 35); //RGB value I want to start with as "dead grass"
    }
    public Color getColor(){
        return grassColor; //this is what i want to change based on food value;
    }
    private double growthRate = 0.1;
    public void grow(){
        foodValue += (foodValue < 1.0) ? growthRate : 0; //grows the grass to max size of 1.0
    }

我想我也应该提到我的食物值在初始化时设置为随机浮点数。感谢任何建议。

3 个答案:

答案 0 :(得分:1)

    private void setColor(){
        grassColor = new Color(107, 142, 35);
    }

看到那些用来创建自定义颜色的数字了吗?它们可以是变量名,指向数字,这些数字会根据程序中其他可能影响颜色的内容在其他位置进行更新。

有时我会参考https://www.google.com/search?client=safari&rls=en&q=rgb+color+picker&ie=UTF-8&oe=UTF-8来选择适合该情况的颜色。它整齐地显示了不同系统的值,而不仅仅是RGB。

https://docs.oracle.com/javase/7/docs/api/java/awt/Color.html#getHSBColor(float,%20float,%20float)将为您提供一种使用HSB输入的方式,如果您不想使用RGB系统。如果您想尝试其他颜色系统,可能还有其他有用的东西。

答案 1 :(得分:1)

使用HSB颜色模型可能是最好的选择。

  • H =色相;代表色环:
    红色,黄色,绿色,青色,蓝色,洋红色,然后返回红色。

  • S =饱和度;颜色的纯度:
    零饱和度始终是灰色阴影。 (R,G,B值都相等)
    最大饱和度始终具有至少等于零的RGB值之一。

  • B =亮度;颜色有多暗:
    零亮度始终为黑色

使用java.​awt.​Color.getHSBColor(h, s, b),您可能会从(0.166,0.8,0.5)开始
会是(黄色,略微静音,中等暗),带褐色,
然后升至(0.333,1.0,1.0)以获得纯春天绿色
可能最终得到那个较暗,稍蓝色的夏季结果(0.4,1.0,0.9)。

玩一些符合您需求的数字。

答案 2 :(得分:0)

您可以将颜色的“绿色”值直接绑定到foodValue。这将根据您的foodValue增加颜色的绿色强度。不需要其他更改。

示例:

class Grass {
    
    private double foodValue = 0.0;
    private double growthRate = 0.1;
    private Color grassColor;
    
    public Grass() {
        setColor();
    }
    
    private void setColor(){ // this could be removed if grassColor is initialized on top
        grassColor = new Color(107, 142 + (int)(foodValue * 100), 35); 
    }
    public Color getColor(){
        return grassColor;
    }
    
    public void grow(){
        foodValue += (foodValue < 1.0) ? growthRate : 0; //grows the grass to max size of 1.0
    }
}

这真的很简单,可以满足您的目的。