随机生成独特的颜色?

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

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

是否有更聪明的方法来生成(255,255,255)格式的随机和独特颜色?

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

有关使用HSV / HSL处理颜色的详细信息,请参阅Wikipedia ,包括如何将HSV转换为RGB 。

检查“颜色距离”

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

N是您决定的值。

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

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

关于独特性,请看这里 。

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

我曾经写过一次实用function。

想法是将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]值,你可以在相同的间隔内旋转它,比如说三分之一。

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

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