如何在Java中以彩虹顺序循环遍历所有RGB组合?

问题描述 投票:0回答:2

我正在尝试按彩虹顺序循环所有 RGB 颜色。目前我有这个:

int state = 1;
int a = 255;
int r = 255;
int g = 0;
int b = 0;

if(g < 255 && state == 1){
    g++;
    r--;
    if(g == 255)
        state = 2;
}
if(b < 255 && state == 2){
    b++;
    g--;
    if(b == 255)
        state = 3;
}
if(state == 3){
    r++;
    b--;
    if(b == 0)
        state = 1;
}

int hex = (a << 24) + (r << 16) + (g << 8) + (b);

它可以工作,但似乎没有获得所有颜色。我知道这可能是一个不好的方法,是的,我知道我可以在彼此内部做 3 个循环,但是有人知道更好的方法来获得所有颜色吗?

另外,我不使用 3 个循环的原因是因为它需要在每个新的 RGB 组合之后更新,而不是在循环完成之后更新,因为这每次都会给我相同的结果。

编辑: 感谢 pbabcdefp 我让它工作了,解决方案如下。

int state = 0;
int a = 255;
int r = 255;
int g = 0;
int b = 0;
if(state == 0){
    g++;
    if(g == 255)
        state = 1;
}
if(state == 1){
    r--;
    if(r == 0)
        state = 2;
}
if(state == 2){
    b++;
    if(b == 255)
        state = 3;
}
if(state == 3){
    g--;
    if(g == 0)
        state = 4;
}
if(state == 4){
    r++;
    if(r == 255)
        state = 5;
}
if(state == 5){
    b--;
    if(b == 0)
        state = 0;
}
int hex = (a << 24) + (r << 16) + (g << 8) + (b);
java loops colors rgb
2个回答
0
投票

您需要找到所有组合。您的代码的问题在于,在一个循环中您修改了两个值。在这种情况下,您会跳过一种颜色。例如,您有 G=100 和 R=100:

g++; r--; 在此行之后,G 将是 101,R 将是 99。下次将是 G102,R98 您现在获得了三种组合:

[g100,r100],g[101,r99],g[102,r98]。

但是你在这里错过了很多其他组合,例如 [g100,r99] 和 g[101,r100] 或 g[101,r98] 等。


0
投票

您可以创建一个

RGB
类来保存 ARGB 值,并创建一个方法将该值增加 1。

考虑下面的课程。

class RGB {
    int alpha, red, green, blue;

    void next() {
        if (blue != 255) blue++;
        else if (green != 255) green++;
        else if (red != 255) red++;
        else if (alpha != 255) alpha++;
        else throw new IndexOutOfBoundsException();
    }

    @Override
    public String toString() {
        return "%02x%02x%02x%02x".formatted(alpha, red, green, blue);
    }
}

输出示例

00000001
00000002
00000003
00000004
00000005
...
fbffffff
fcffffff
fdffffff
feffffff
ffffffff
© www.soinside.com 2019 - 2024. All rights reserved.