我刚写了一个小类,它产生了完美独特的颜色(或者说这是计划)。我在网上找到了最初的索引转移片段,并且只是想知道它是否可以改进,或者使用它是否会出现任何问题。
这是用于创建独特颜色的类。
public class UniqueColorGenerator
{
private int _colorIndex;
public UniqueColorGenerator()
{
}
public Color Next()
{
_colorIndex++;
byte red = ( byte )( _colorIndex & 0x000000FF );
byte green = ( byte )( ( _colorIndex & 0x0000FF00 ) >> 08 );
byte blue = ( byte )( ( _colorIndex & 0x00FF0000 ) >> 16 );
return Color.FromArgb( red , green , blue );
}
}
我正在使用它来进行几何选择"在OpenGL中。它也很漂亮。这是16,384个四边形的图片,它们有自己独特的颜色......或者我想我应该说"独特的红色和黑色色调"。
当我第一次跑它时,我发誓它们是明显重复的。但他们并非如此。采摘工作不仅完美无瑕,而且还经历了色彩并没有发生过一次碰撞。我仍然想知道,如果生成器当前是如何构建的,可能会出现任何问题 - 除了达到整数最大值,这也永远不会发生。
而且,你们是否知道我如何能更多地随机化颜色,所以不是得到不同的红色,我可以在光谱中收到更多的颜色?
答案 0 :(得分:1)
如果使用HSL颜色模型,可能会有更好的效果。 RGB值可能最终偏向更暗或更浅的颜色。如果您使用HSL(色调,饱和度和光照),则可以将Saturation
和light
设置为固定值或窄范围值,然后选择随机hue
。
饱和度从0%(变性)到100%(完全饱和)
光线从0%(黑色)到100%(白色),平均50%。
hue
是色轮上0到360º之间的值。
使用此颜色空间可能会产生更好的随机颜色生成器,或者至少有一个具有更多微调控件。
答案 1 :(得分:0)
我只是想张贴自己的小东西。我不会接受这个作为答案,但我只是想用我已经收到的建议来展示一个简单的模型。主要来自Codereview:Codereview Link
public class UniqueColorGenerator {
private int _colorIndex;
private readonly int _offsetIncrement;
public UniqueColorGenerator() {
this._offsetIncrement = 1;
}
public UniqueColorGenerator( uint offsetIncrement ) {
this._offsetIncrement = ( int )offsetIncrement;
}
public Color Next() {
return Color.FromArgb( _colorIndex += _offsetIncrement );
}
}
该类与我的原始示例完全相同,但更简单,甚至增加了一些独特性的空间。你在构造函数中添加的数字越大,最终模式就越疯狂;这里有一个简单的例子,说明如果你喂养" 2834783"进入构造函数:
是的,所有颜色仍然是独一无二的。我可以从这个新代码中看到的唯一问题是,如果用户输入一个非常高的数字,就会出现这个问题。