提问人:user3166950 提问时间:8/3/2015 最后编辑:user3166950 更新时间:10/23/2023 访问量:10745
如何在 Java 中以彩虹顺序遍历所有 RGB 组合?
How can I loop through all RGB combinations in rainbow order in Java?
问:
我正在尝试以彩虹顺序遍历所有 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);
答:
0赞
Veselin Davidov
8/3/2015
#1
您需要找到所有组合。代码的问题在于,在一个循环中修改了两个值。在本例中,您将跳过一种颜色。例如,您有 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赞
Reilas
5/22/2023
#2
您可以创建一个类来保存 ARGB 值,并创建一个将值增加 1 的方法。RGB
请考虑以下类。
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
评论
hue
g++
getHSBColor()
的静态工厂方法,它应该可以完成这项工作。java.awt.Color