随机颜色生成器,可生成可在TCL中明显区分的颜色

时间:2012-02-13 06:31:55

标签: tcl

有谁知道如何生成一堆随机颜色而不会让它们看起来过于相似而无法被人眼区分?

我可以使用以下方法生成随机颜色代码:

    set r [expr { int(256 * rand()) }]
    set g [expr { int(256 * rand()) }]
    set b [expr { int(256 * rand()) }]

    set newColor [format "#%02x%02x%02x" $r $g $b]

然后我会使用'if'条件来确保生成的颜色代码不会重复。在那之后,我有点卡住了。

请帮忙。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

当生成视觉上与众不同的颜色时,最便宜的方法是从HSV颜色空间中选择随机值,然后将它们转换为RGB。在the Tcler's Wiki中进行转换有一些很好的代码,你可以将它与你自己的代码集成,就像这样:

proc getRandomColor {} {
    set h [expr { int(256 * rand()) }]
    set s [expr { int(256 * rand()) }]
    set v [expr { int(256 * rand()) }]

    lassign [hsvToRgb $h $s $v] r g b

    return [format "#%02x%02x%02x" $r $g $b]
}

set newColor [getRandomColor];   # I find it's best to make such bits into procs

现在,这不是保证生成独特的颜色,但它确实可以减少问题。如果你需要坚持鲜艳的色彩,减少S和V通道的变化(即选择较小的随机范围), 注意 ,颜色不是'无法访问;确保彩色编码信息也以不同方式传达。

答案 1 :(得分:2)

我会采取略有不同的方法。首先,你应该知道每个人对颜色的区别不同,女性似乎能够区分出比男性更多的颜色。有关阅读的详细信息,请参阅XKCD颜色调查。 http://blog.xkcd.com/2010/05/03/color-survey-results/因此,尽管RGB空间中有数百万种可能的颜色,但我们只能将它们分成几十个分组(蓝色,红色,绿色等)。

我会先从我知道可以区分的颜色列表开始,例如https://en.wikipedia.org/wiki/X11_color_names 用这些例如。

创建所有RGB的列表
set colours [list "F0F8FF" "FAEBD7" "00FFFF"]

然后只需从列表中随机选择一种颜色:

set num_of_colours [llength $colours]
set my_colour_index [expr { int($num_of_colours * rand()) }]
set my_colour [lindex $colours $my_colour_index]