Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-创建离散彩虹颜色数组_Java_Swing_Colors_Gradient_Rgb - Fatal编程技术网

Java-创建离散彩虹颜色数组

Java-创建离散彩虹颜色数组,java,swing,colors,gradient,rgb,Java,Swing,Colors,Gradient,Rgb,很难描述我想做什么。我基本上想创建一个离散的彩虹渐变,这样对于任何一行I个jButton,穿过它们的颜色渐变看起来都是彩虹 我已经做了以下操作,但它只会创建一个红色渐变,然后是绿色渐变,然后是蓝色渐变: Color[] c = new Color[i]; for(int n = 0; n < i; n++) { if(n < i/3) { c[n] = new Color(255, 255/(n+1), 255/(n+1));

很难描述我想做什么。我基本上想创建一个离散的彩虹渐变,这样对于任何一行I个jButton,穿过它们的颜色渐变看起来都是彩虹

我已经做了以下操作,但它只会创建一个红色渐变,然后是绿色渐变,然后是蓝色渐变:

Color[] c = new Color[i];
    for(int n = 0; n < i; n++) {
        if(n < i/3) {
            c[n] = new Color(255, 255/(n+1), 255/(n+1));
        } else if(n < 2*i/3) {
            c[n] = new Color(255/(n-(i/3)), 255, 255/(n-(i/3)));
        } else {
            c[n] = new Color(255/(n+1), 255/(n+1), 255);
        }
    }
Color[]c=新颜色[i];
对于(int n=0;n
你知道我怎样才能得到彩虹效果吗

谢谢

编辑:

使用了一个正弦函数,它似乎工作得稍微好一点,但不确定如何定义它,所以我在我想要的区域中得到一个“彩虹波”:

for(int n = 0; n < i; n++) {
        c[n] = new Color((int)(Math.sin(n) * 127 + 128), (int)(Math.sin(n + Math.PI/2) * 127 + 128), (int)(Math.sin(n + Math.PI) * 127 + 128));
    }
for(int n=0;n
您的代码有正确的想法,但您需要以稍微不同的方式运行颜色

假设你从绿色开始:

Color(  0, 255,   0)
慢慢加入一些红色,变成黄色:

Color( 51, 255,   0)
Color(102, 255,   0)
Color(153, 255,   0)
Color(204, 255,   0)
Color(255, 255,   0)
然后,将绿色部分换成红色:

Color(255, 204,   0)
Color(255, 153,   0)
Color(255, 102,   0)
Color(255,  51,   0)
Color(255,   0,   0)
现在,添加蓝色以获得紫色:

Color(255,   0,  51)
Color(255,   0, 102)
Color(255,   0, 153)
Color(255,   0, 204)
Color(255,   0, 255)
然后,去掉红色,变成蓝色:

Color(204,   0, 255)
Color(153,   0, 255)
Color(102,   0, 255)
Color( 51,   0, 255)
Color(  0,   0, 255)
重新添加绿色以获得青色:

Color(  0,  51, 255)
Color(  0, 102, 255)
Color(  0, 153, 255)
Color(  0, 204, 255)
Color(  0, 255, 255)
最后去掉蓝色,回到绿色:

Color(  0, 255, 204)
Color(  0, 255, 153)
Color(  0, 255, 102)
Color(  0, 255,  51)
Color(  0, 255,   0)
当然,在这个循环中,你可以从任何地方开始,朝任何方向走

在代码中,它可以看起来像这样简单:

List<Color> colors = new ArrayList<Color>();
for (int r=0; r<100; r++) colors.add(new Color(r*255/100,       255,         0));
for (int g=100; g>0; g--) colors.add(new Color(      255, g*255/100,         0));
for (int b=0; b<100; b++) colors.add(new Color(      255,         0, b*255/100));
for (int r=100; r>0; r--) colors.add(new Color(r*255/100,         0,       255));
for (int g=0; g<100; g++) colors.add(new Color(        0, g*255/100,       255));
for (int b=100; b>0; b--) colors.add(new Color(        0,       255, b*255/100));
                          colors.add(new Color(        0,       255,         0));
需要注意的一点是:人眼对绿色比对红色和蓝色更敏感。因此,您可能希望添加和删除绿色的步骤比添加红色和蓝色的步骤要小。只需使用不同的步长,直到得到看起来均匀的步长

PS:就我使用它的目的而言,如上所述的线性衰落是完全足够的,看起来和预期的一样。我个人认为你不需要通过使用正反或其他数学来把事情复杂化。

你可以使用HSV(色调、饱和度、值) 而不是RGB。 在HSV中,颜色范围仅受一个变量(色调)的影响。 如果从0运行到360,则覆盖整个颜色范围

代码示例:

final int ARRAY_SIZE = 100;
double jump = 360.0 / (ARRAY_SIZE*1.0);
int[] colors = new int[ARRAY_SIZE];
for (int i = 0; i < colors.length; i++) {
    colors[i] = Color.HSVToColor(new float[]{(float) (jump*i), 1.0f, 1.0f});
}
final int ARRAY_SIZE=100;
双跳转=360.0/(数组大小*1.0);
int[]colors=新int[ARRAY_SIZE];
for(int i=0;i
如果您只想覆盖颜色表的一部分(请使用我随附的图片)。 红色的绿松石色阵列示例:

final int ARRAY_SIZE = 100;
final int MAX_COLOR = 360;
final int MIN_COLOR = 160;
double jump = (MAX_COLOR-MIN_COLOR) / (ARRAY_SIZE*1.0);
int[] colors = new int[ARRAY_SIZE];
for (int i = 0; i < colors.length; i++) {
    colors[i] = Color.HSVToColor(new float[]{(float) (MIN_COLOR + (jump*i)), 1.0f, 1.0f});
}
final int ARRAY_SIZE=100;
最终整数最大颜色=360;
最终整型最小颜色=160;
双跳转=(最大颜色-最小颜色)/(数组大小*1.0);
int[]colors=新int[ARRAY_SIZE];
for(int i=0;i

我已经完成了,但没有算法。这并不容易,据我记忆,这是一个相当复杂的算法。在我想出一个有用的算法之前,我在paint的颜色编辑器中坐了一会儿,看看RGB是如何在2D比例上工作的。我所做的一个例子可以在这里看到(我的颜色数组在底部)@zgc7009看起来相当复杂!仍然需要一些调整,但它是相当复杂的。当我回到我的桌面上,我会发现我找不到算法,至少给你一个开始的地方。也考虑<代码>颜色。GethsbBu色[< /代码>,看到了。非常感谢,真的很有帮助!
final int ARRAY_SIZE = 100;
final int MAX_COLOR = 360;
final int MIN_COLOR = 160;
double jump = (MAX_COLOR-MIN_COLOR) / (ARRAY_SIZE*1.0);
int[] colors = new int[ARRAY_SIZE];
for (int i = 0; i < colors.length; i++) {
    colors[i] = Color.HSVToColor(new float[]{(float) (MIN_COLOR + (jump*i)), 1.0f, 1.0f});
}