【问题标题】:How to generate a set of random colors where no two colors are almost similar?如何生成一组没有两种颜色几乎相似的随机颜色?
【发布时间】:2010-09-03 03:22:46
【问题描述】:

我目前使用以下函数来生成颜色的随机十六进制表示。

function getRandomColor($max_r = 192, $max_g = 192, $max_b = 192) {
    if ($max_r > 192) { $max_r = 192; }
    if ($max_g > 192) { $max_g = 192; }
    if ($max_b > 192) { $max_b = 192; }
    if ($max_r < 0) { $max_r = 0; }
    if ($max_g < 0) { $max_g = 0; }
    if ($max_b < 0) { $max_b = 0; }

    return '#' . dechex(rand(0, 192)) . dechex(rand(0, 192)) . dechex(rand(0, 192));
}

请注意,我将最大值设置为 192 而不是 255,唯一的原因是我避免使用非常浅的颜色,目的是使用随机颜色作为白色背景中的前景。

我的问题是如何生成一组无限编号的颜色,其中没有几乎相同的颜色。例如:#D964D9 & #FF3EFF ?

【问题讨论】:

  • 在寻找解决方案时要记住的一件事是,如果您计划将随机选择的两种颜色彼此靠近显示,那么有许多颜色根本不属于一起,并且会让你的眼睛流血。

标签: colors


【解决方案1】:

使用HSV 坐标可能会更好。如果不需要白色或黑色,可以将 S 和 V 设置为其最大值,并生成彼此不太接近的 H 值(模 360 度)。然后转成RGB。

【讨论】:

  • 感谢这一点,我了解到实际上只有 12 种颜色实际上是独一无二的(至少在我眼中是这样的)
【解决方案2】:

我想到了几种方法:

  1. 设置一组 n 个标准颜色并随机交换它们以产生所需的“随机”颜色。
  2. 填充n种颜色的数组;生成随机颜色并检查数组中是否已经存在“关闭”的东西。如果是这样,请选择另一种随机颜色。
  3. 选择每种颜色作为确定性序列,就像一个简单的哈希值,旨在不产生重复值。 Grey code 浮现在脑海中。

【讨论】:

    【解决方案3】:

    您的算法可以随机生成 RGB 颜色(就像现在一样),但是您可以例如在接受颜色选择之前验证两个 R 是否足够不同。该算法可以针对给定的 R、G 和/或 B 重复该步骤(最多 4...10...N 次)。

    while ( (R1 > $max_r/2) && (R2 > $max_r/2) ) {
    // Both are in the upper half of range, get a new random value for R1.
    }
    

    其他可能性:

    • 在范围的下半部分重复
    • 进一步细分范围(分为 1/3 或 1/4)
    • G 和 B 音调重复

    【讨论】:

      猜你喜欢
      • 2018-03-22
      • 1970-01-01
      • 2018-01-08
      • 2010-12-07
      • 1970-01-01
      • 2021-06-02
      • 2015-10-14
      • 2017-09-11
      • 2013-07-06
      相关资源
      最近更新 更多