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

随机颜色生成器,生成在TCL中可以明显区分的颜色,tcl,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”条件来确保生成的颜色代码不

有人知道我如何生成一组随机颜色,而不让它们看起来太相似以至于人眼无法分辨吗

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

    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”条件来确保生成的颜色代码不会重复。在那之后,我有点被卡住了

请帮忙。
提前感谢。

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

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通道中的变化(即,选择较小的随机范围),并注意该颜色不可访问;确保颜色编码的信息也以不同的方式传达。

我会采取稍微不同的方法。首先,你应该知道每个人区分颜色的方式都不同,而且女性似乎比男性能分辨更多的颜色。请参阅XKCD颜色调查,了解有关此内容的有趣阅读。因此,尽管RGB空间中有数百万种可能的颜色,但我们只能将它们分成几十组(蓝色、红色、绿色等)

我会从一个我知道可以辨别的颜色列表开始。 创建一个包含所有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]

你应该对此感兴趣!谢谢你,布莱恩。这是个好主意。但我无法控制所需颜色的数量。因此,该数量可能会超过我创建的颜色列表中的颜色数量。@Mich不客气,但我认为您回到了生成人眼无法区分的颜色的原始问题。我以为这就是你想要避免的?当然,还有比我在回答中提供的链接长得多的列表,例如谢谢多纳尔。从HSV中选择随机值是一个好主意。但是,我不确定这是否是我的问题,我认为在提供的链接中有一些bug。当h=8、s=221和v=109时,hsv2rgb返回me{27904-6138880-6138880}。我觉得这个链接会更好@Mich:是的,看起来效果更好。将编辑我的答案以使用更好的链接