我的目标是生成一些人们可以轻松看到的独特随机颜色。这意味着我尽量避免同时拥有海蓝色和天蓝色。我喜欢紫红色和海蓝色。
我想我需要一个变量,这将是一个"差距"在任何生成的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,那么我只生成基本的随机颜色。
感谢任何帮助,抱歉英语不是我的母语。
非常感谢。
答案 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);
}