在java中浏览所有颜色

时间:2014-02-18 19:38:16

标签: java algorithm colors cycle

我正在尝试编写一个遵循逻辑的方法:

我有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-methods来实现这个目标:

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

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

有没有人对如何循环颜色有另一个想法?

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

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

所以每次调用update方法(全5 ms)时,都会调用代码。

有什么想法吗?

4 个答案:

答案 0 :(得分:4)

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

getHSBColor(float h, float s, float b)

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

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

答案 1 :(得分:3)

根据你的周期,你有6个过渡,每个过渡256步。每个转换都在所有三个RGB通道上工作,但是以一种移位的方式工作。

例如,假设您从255,0,0开始,您将拥有类似的内容:

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

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

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

     R   Y   G   C   B   M   R..
从这里可以很容易地看出,整个时期是6个片段×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); }

同样适用于蓝色通道。

答案 2 :(得分:1)

以下是您使用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 */
        }
    }
}

答案 3 :(得分:0)

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到另一个变量。