生成独特的随机颜色(在Android / Java中)

时间:2014-08-14 11:06:48

标签: java android random colors

我的目标是生成一些人们可以轻松看到的独特随机颜色。这意味着我尽量避免同时拥有海蓝色和天蓝色。我喜欢紫红色和海蓝色。

我想我需要一个变量,这将是一个"差距"在任何生成的RGB之间。例如,如果间隙为60,那么第一和第二颜色不能是RGB(12,27,38)和RGB(45,102,177),因为红色值的差异小于60.(45-12 = 33)。

这是我到目前为止所尝试的:

int temp;

        for(int i = 0; i < size; i++)
        {
            Rectangle r = new Rectangle();
            temp = COLOR_LIMIT - colourGap;

            if(i == 0 || temp <= 0)
                colour = Color.argb(255, randomColour.nextInt(COLOR_LIMIT), randomColour.nextInt(COLOR_LIMIT), randomColour.nextInt(COLOR_LIMIT));
            else
                colour = Color.argb(255, randomColour.nextInt(temp), randomColour.nextInt(temp), randomColour.nextInt(temp));

            temp-=colourGap;
        }

通过上面的代码,我意识到与基本随机相比,生成的颜色更加独特。但是,我上面的代码不灵活,只是一个临时修复(我需要每次都使用迭代大小和间隙变量)。我相信应该有任何聪明的方法来做到这一点。基本上,我只是将限制减少60,如果限制小于或等于0,那么我只生成基本的随机颜色。

感谢任何帮助,抱歉英语不是我的母语。

非常感谢。

2 个答案:

答案 0 :(得分:4)

您需要考虑&#34;色彩空间&#34;作为一个三维空间,并查看您所选空间之间的距离。

即。 r1,g1,b1和r2,g2,b2之间的距离为sqrt((r1-r2)^2+(g1-g2)^2+(b1-b2)^2)

然后,您可以检查事物的紧密程度并确定阈值。

更简单的方法是定义一个&#34;网格&#34;可接受的颜色间隔足够远的方式看起来不同。

即。 r = random.nextInt(4)*32, g = random.nextInt(4)*32, b = random.nextInt(4)*32

现在您只需要检查其他生成的颜色是否完全匹配,并且您知道所选颜色之间的距离最小。为了保证更远的距离,您可以检查是否有任何2个或任何1个组件完全匹配,尽管通过这样做可以大量减少可能的颜色数量。

答案 1 :(得分:2)

可能this question可能会给你一个线索。

接受的答案建议以一定的间隔更改HSV color scheme的Hue值,同时使其他两个参数随机。这就是Android中的样子:

for (int i = 0; i < 360; i += 360 / colorsNumber) {
    // hsv[0] is Hue [0 .. 360) hsv[1] is Saturation [0...1] hsv[2] is Value [0...1]
    float[] hsv = new float[3];
    hsv[0] = i;
    hsv[1] = (float) Math.random(); // Some restrictions here?
    hsv[2] = (float) Math.random();

    colors[i] = Color.HSVToColor(hsv);
}