【问题标题】:Going through all colors in java遍历java中的所有颜色
【发布时间】:2014-03-18 19:00:01
【问题描述】:

我正在尝试编写以下逻辑的方法:

我有 3 个整数,r、g 和 b。

开头:

r = 255;
g = 0;
b = 0;

现在你可以看到,r 是 255,现在 g 应该也一个一个上升,直到达到 255

r = 255;
g = 255;
b = 0;

所有三个整数一起构成一种颜色。第一个是红色的,现在是黄色的。不是它应该变成绿色,所以 r 应该减小直到只有 g 为 255:

r = 0;
g = 255;
b = 0;

下一个颜色应该是青色,以此类推。

这是顺序:

red - yellow - green - cyan - blue - violet - red 

--> 从头开始​​。

我尝试通过使用 if 方法来实现这一点:

e.g.: if(r == 255 && g == 0) g++;

等等。 ,但我意识到这将是漫长而复杂的。

有人对如何循环颜色有其他想法吗?

我的目标是在每次更新时更改方形对象的颜色:

public void update() {
    -->color change code here<--
    color = new Color(r, g, b, alpha);
}

所以每次调用更新方法(全部 5 毫秒)时,都会调用代码。

有什么想法吗?

【问题讨论】:

  • 您想从一种颜色逐渐过渡到另一种颜色,对吧?也许您可以创建一大堆硬编码的Color 对象。它将只有 1500 个元素长,左右:-)

标签: java algorithm colors cycle


【解决方案1】:

java.awt.Color类提供静态函数

getHSBColor(float h, float s, float b)

使用 HSB 颜色空间,使色调分量从 0 变为 1,同时保持其他分量不变。

color = Color.getHSBColor(hue, 1, 1);

【讨论】:

  • 这绝对正确,我一定在考虑另一个 API,其中色调被指定为度数 (1 - 360)。
【解决方案2】:

根据您的循环,您有 6 个转换,每个转换 256 个步骤。每个过渡都适用于所有三个 RGB 通道,但方式有所不同。

例如,假设您从255,0,0 开始,您将有如下内容:

R 255 --- \             / ---
           \           /
  0         \ --- --- /

G 255   / --- --- \
       /           \
  0   /             \ --- ---

B 255           / --- --- \
               /           \
  0   --- --- /             \

     R   Y   G   C   B   M   R..

从这里你可以很容易地看到整个周期是 6 个片段 x 256 步。在每个片段上,每个通道都可以是稳定的、上升的或下降的。同时你可以看到绿色和蓝色通道就像红色通道刚刚移动一样。

所以我们可以只关注红色通道:

int redValueForStep(int step) {
  step %= 256*6; // let's make step wrap around
  int fragment = step/256; // which fragment 0-5
  int fragmentStep = step%256; // which step inside fragment 0-255

  switch (fragment) {
    case 0: case 5: 
      return 255; // first and last fragment have steady high value
    case 2: case 3:
      return 0; // fragments 2 and 3 have steady low value
    case 1: return 255-fragmentStep; // falling
    case 2: return fragmentStep; // rising
}

一旦你有了红色通道,你就可以很容易地计算另一个,绿色通道向前移动了两个完整的片段,所以你添加 4 来环绕(以避免产生负值):

int greenValueForStep(int step) { return redValueForStep(step+256*4); }

同样适用于蓝色通道。

【讨论】:

  • 哇,感谢您的回答,听起来比我最初使用“if”更容易......但我更喜欢使用 Color.GetHSBColor()。但是谢谢你的想法!
【解决方案3】:

这是您使用 for 循环显示的更改的示例,希望对您有所帮助!

public class rgb {
    public static void main(String[] args) {
        // establish your starting conditions
        int r, g, b;
        r = 255;
        g = 0;
        b = 0;

        // increment g by 1 until it reaches 255
        for (int i = 0; i <= 255; i++) {
            g = i;
            /* Do whatever you
             * want with this
             * color here */
        }

        // de-increment r by 1 until it's 0
        for (int i = 254; i >= 0; i--) {
            r = i;
            /* Do whatever you
             * want with this
             * color here */
        }
    }
}

【讨论】:

    【解决方案4】:
    for (int red=0; red<256; red++)
        for (int green=0; green<256; green++)
            for (int red=0; red<256; red++) {
            // output of every combination of all red, green and blue
            }
    

    或者,如果您只想要 0 和 255 的值,只需将它们计数为 1,然后乘以 255 到另一个变量中。

    【讨论】:

    • 不,他/她想要所有最大饱和度的颜色,而不是所有可能的颜色,而不仅仅是分量为 0 或 255 的八种颜色。这不是他/她想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2012-05-28
    • 1970-01-01
    • 2014-02-05
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多