【问题标题】:Generating unique random colors (in Android/Java)生成唯一的随机颜色(在 Android/Java 中)
【发布时间】:2014-10-08 00:22:57
【问题描述】:

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

我认为我需要有一个变量,它将成为任何生成的 RGB 之间的“间隙”。例如,如果gap为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,那么我只生成一个基本的随机颜色。

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

非常感谢。

【问题讨论】:

标签: java android random colors


【解决方案1】:

您需要将“色彩空间”视为 3 维空间,并查看其中所选空间之间的距离。

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

然后您可以检查事物之间的距离并定义一个阈值。

不过,一种更简单的方法是定义一个可接受颜色的“网格”,它们之间的距离足够远,看起来不同。

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

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

【讨论】:

  • 抱歉回复晚了,我会尝试你更简单的解决方案。谢谢
  • 感谢您的帮助,现在我解决了我的主要问题。只是一个小问题...therandomColour.nextInt(4) + 1) * 64 和 randomColour.nextInt(8) + 1) * 32 只有一点点区别。现在我需要组织“难度”,所以我想从非常简单和不同的颜色开始。有什么想法吗?
  • @BlazeTama 将网格隔得更远,或者检查是否有两种颜色匹配,而不是检查所有三种颜色。甚至检查是否有任何一种颜色匹配,尽管这只允许少量颜色。 (即如果红色 0 已被占用,则不允许其他红色 0。
【解决方案2】:

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

接受的答案建议以一定间隔更改HSV color scheme 的色调值,同时使其他两个参数随机化。这就是它在 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);
}

【讨论】:

    猜你喜欢
    • 2011-06-11
    • 2013-02-02
    • 2015-01-12
    • 1970-01-01
    • 2011-12-28
    • 2013-12-31
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多