随机生成独特的颜色?

时间:2010-06-28 18:38:08

标签: c#

我正在使用可绘制彩色线条的图形包(255,255,255)。 基本上我正在做的是(Random.Next(0,255),Random.Next(0,255),Random.Next(0,255))每次添加一行时都会生成一种颜色。

这一切都很好,但有时,我得到的颜色看起来非常相似,这使得用户很难辨别哪些数据对应哪一行。

是否有更聪明的方法可以生成(255,255,255)格式的随机和唯一颜色?

7 个答案:

答案 0 :(得分:12)

更好的选择是通常生成随机色调,并使用HSL或HSV颜色(使用该色调)将色调转换为RGB颜色。通过使用随机“色调”而不是随机颜色,您的颜色会有更多变化。如果您需要更多变化,您还可以随机化其他组件(饱和度/值等)。

请参阅Wikipedia for details on working in colors using HSV/HSL,包括如何convert HSV to RGB

答案 1 :(得分:7)

检查“颜色距离”

假设RGB是XYZ坐标,进行3D距离计算。如果颜色与之前生成的所有颜色之间的距离不至少为N,请重试。

N是您决定的值。

答案 2 :(得分:1)

假设阴影的差异是坐标之间欧氏距离的度量, 你可以 1.记住以前生成的颜色(a,b,c)
2.确保生成的下一个(x,y,z)至少是最大可能距离的一半 即sqrt [(a-x)^ 2 +(b-y)^ 2 +(c-z)^ 2]> 1/2 sqrt(3 * 255 ^ 2)
3.继续生成随机三元组,直到你得到一个满足上述...如果1/2不够好,尝试2/3等。强文

答案 3 :(得分:0)

一个非常简单的解决方案可能是以((Random.Next(0, 32) * 8) % 256)为例,使用更多不同的级别。也许查找表可用于跳过已经使用过的颜色。

答案 4 :(得分:0)

关于唯一性,请查看here

为了获得更清晰的色差,您可能会尝试不允许所有可能的值从0到255,但只允许一些步骤,例如0-32-64-96-128-160-192-224-255,所以你得到了一点对比。

答案 5 :(得分:0)

我曾经写过一次实用功能。

想法是将RGB空间线性化为1D [0,1]间隔。例如做(R + G * 256 + B * 256 * 256)/(256 ^ 3 * 256 ^ 2 + 256)。

然后,每当你需要一个新颜色时,你将之前采样产生的间隔分成2个。你在新空间中选择第一个颜色为0.0,第二个颜色为1.0,第三个颜色为0.5,然后是0.25,然后是0.75等等。这有点保证,如果你产生很少的颜色,他们有最大的“分离”(虽然也没有用色调来衡量)。当您生成越来越多的颜色时,它们往往更接近之前生成的颜色,但始终遵循最大分离原则。

获得[0,1]值后,使用反函数(实际上是函数的三元组)返回RGB。

在基本实现中,您将获得白色和黑色作为两种第一种颜色。如果你想要一些不同的东西,一旦你产生了'输入'[0,1]值,你可以在相同的间隔内旋转它,比如说三分之一。

这非常有效并且确定性地表现(没有无限次重试)。

答案 6 :(得分:0)

是否有任何理由使颜色随机化,而不是以固定顺序输出?我建议你使用一个每种颜色增加的索引。对颜色使用常数(可能是最大)饱和度,使亮度为压裂(索引 const1),色调为压裂(索引 const2)。我不确定如何最好地计算const1和const2;这将取决于你将拥有多少积分。