Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 随机生成独特的颜色?_C# - Fatal编程技术网

C# 随机生成独特的颜色?

C# 随机生成独特的颜色?,c#,C#,我正在使用一个可以绘制颜色线的图形包(255255)。 所以基本上我所做的是(Random.Next(0255),Random.Next(0255),Random.Next(0255))在每次添加一行时生成一种颜色 这一切都很好,但有时,我得到的颜色看起来非常相似,这使得用户很难辨别哪些数据对应于哪一行 (255255255)格式中是否有更聪明的方法生成随机和独特的颜色?更好的选择是通常生成随机色调,并使用HSL或HSV颜色(使用该色调)将色调转换为RGB颜色。通过使用随机的“色调”而不是随机的

我正在使用一个可以绘制颜色线的图形包(255255)。 所以基本上我所做的是(Random.Next(0255),Random.Next(0255),Random.Next(0255))在每次添加一行时生成一种颜色

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


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

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

请参阅,包括如何。

检查“颜色距离”

假设RGB是XYZ坐标,请执行三维距离计算。如果颜色与以前生成的所有颜色之间的距离不小于N,请重试


N是一个由您决定的值。

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

关于唯一性,请查看


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

假设色度差异是坐标之间欧氏距离的度量, 你可以
1.还记得之前生成的颜色(a、b、c)
2.确保生成的下一个距离(x、y、z)至少超过最大可能距离的一半
i、 平方米[(a-x)^2+(b-y)^2+(c-z)^2]>1/2平方米(3*255^2)

3.继续生成随机三元组,直到得到满足上述条件的一个。。如果1/2不够好,试试2/3等等。我曾经写过一个实用函数来实现这一点

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


这工作得很好,而且它的行为是决定性的(没有无限次的重试)。

有什么理由随机化颜色,而不是以固定的顺序输出它们吗?我建议您使用每种颜色递增的索引。为你的颜色使用一个恒定的(可能是最大的)饱和度,亮度为分形(indexconst1),色调为分形(indexconst2)。我不知道如何最好地计算常数1和常数2;这在某种程度上取决于你将拥有多少个点。

但是,如果R、G和B都是用这种方法生成的,你最终会得到从亮到暗的近乎灰色的颜色。是的,你是对的,一些(暗)范围应该被排除,并且主值不应该太接近(除非相等).它怎么会更变异?一个随机的色调可能与之前的色调相近,至少在感知上是如此。你仍然需要做一些“亲密”checking@Neil:是的,它不能保证是不同的(或者它不会是随机的),但由于您将随机函数分布在色调上而不是RGB上,因此(出于实际目的)将获得人眼更独特的颜色。即使在这里添加距离检查,您也会发现“重新计算”的次数要少得多。不过,在实际应用中,这往往会提供“随机”颜色,而随机RGB往往会给您提供更灰的“随机”颜色方案,而这些方案并没有那么容易区分。我认为您做出了很多假设。色调如何更独特?它们都覆盖相同的颜色空间。用数学术语来说,距离检查会如何降低重铸的可能性?@Neil:Hue是“视觉感觉的属性,根据该属性,一个区域似乎与感知到的颜色之一相似:红色、黄色、绿色和蓝色,或两者的组合”。通过仅随机色调,实际上您正在投影空间中执行随机函数,该空间专门设计用于处理感知颜色的差异。你不会从数学上获得更多的值,但是你会导致一个单一的随机函数在一个空间中工作,在这个空间中,人类生理学感知到颜色的差异。通过随机化巨大而不是试图随机化3个rgb值…@Neil:。。。您创建的随机分布在感知上更独特(而不是数学上)。有时间试试这个-对于随机RGB值,你必须非常小心,因为它很容易将你自己“随机”到“灰色”的颜色范围中,主要是因为人眼在高度饱和、低值的颜色方案中也感觉不到差异。只是随机化色调就可以避免这些颜色,这往往会使颜色“看起来”更独特(它们在数学上不那么独特,但实际上更有用)。这是下面@Phimueme实现更简单想法的概括。只需为一个或两个RGB三元组和le生成值