当前位置: 首页 > 编程语言 > C#

随机生成独特的颜色?分享

时间:2023-04-11 02:16:28 C#

随机生成的独特颜色?我正在使用绘制彩色线条的图形包(255,255,255)。基本上我正在做的是(Random.Next(0,255),Random.Next(0,255),Random.Next(0,255))每次添加一行时生成一种颜色。这一切都很好,但有时,我得到的颜色看起来非常相似,这让用户很难分辨哪些数据对应于哪一行。有没有更聪明的方法来生成(255,255,255)格式的随机和独特的颜色?更好的选择是通常生成随机色调,并使用HSL或HSV颜色(具有该色调)将色调转换为RGB颜色。通过使用随机“色调”而不是随机颜色,您将获得更多颜色变化。如果您需要更多种类,您还可以随机化其他组件(饱和度/值等)。有关使用HSV/HSL处理颜色的详细信息,包括如何将HSV转换为RGB,请参阅维基百科。勾选“ColorDistance”假设RGB为XYZ坐标,进行3D距离计算。如果该颜色与所有先前生成的颜色相差至少N,请重试。N是您决定的值。假设色相差是坐标间欧几里德距离的度量,你可以1.记住之前生成的颜色(a,b,c)2.确保接下来生成的(x,y,z)至少是最大的可能的距离一半,即sqrt[(ax)^2+(by)^2+(cz)^2]>1/2sqrt(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,这样你会得到一点比较的。我曾经写过一个效用函数。这个想法是将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]值,您可以按相同的间隔旋转它,比如三分之一。这非常有效,并且行为具有确定性(没有无限重试)。是否有理由随机化颜色而不是按固定顺序输出它们?我建议您使用针对每种颜色递增的索引。对颜色使用恒定(可能是最大)饱和度,使亮度frac(索引const1)和色调frac(索引const2)。我不确定如何最好地计算const1和const2;这在某种程度上取决于您将获得多少分。以上就是C#学习教程:随机生成唯一颜色?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: