class HsbColor
{
public int Hue { get; set; }
public int Saturation { get; set; }
public int Brightness { get; set; }
public Color ToRGB
{
// left as exercise to the reader...
}
}
public class Item
{
public int Id { get; set; }
private static const byte EXPECTED_MAX = 15;
private static int HUE_FACTOR = 255 / EXPECTED_MAX;
public HsbColor Color
{
get {
var color = new HsbColor() { Saturation = 175, Brightness = 175 };
color.Hue = (Id * HUE_FACTOR) % 255;
return color;
}
}
}
5 回答
可能元素的数量是否具有合理的下限?一种快速简便的解决方案是使用项目的ID存储一系列颜色值 . 这假设您的颜色数量相对较少,并且您确定不会超过一定数量的项目 .
如果你想生成颜色而不是使用列表,那么使它们具有一致和正常外观的一个技巧就是使用HSB生成它们 . 预先定义亮度和饱和度,然后将色调值基于ID的某个函数(这可能是各种各样的事情,具体取决于您计划拥有多少ID,但将ID乘以某个量(并且当它超过时进行修改) 255!)是一个很好的粗略方法 . 使用这种方法,颜色将在饱和度和亮度方面全部“对齐”,但它们每个都具有不同的颜色 .
我在工作上有点无聊,所以我掀起了一个快速的解决方案:
我已经检查了所有这些方法,解决了很多方法 . 最后用CIEde2000蛮力,真的,你最好的选择只是一个静态列表 . 无论你做什么,你都不能获得超过30种颜色,并且具有良好的清晰度 . 色盲的因素和混乱的线条,你真的在做一些阻碍 . 使用查找表并使用除颜色之外的其他一些特征修改数据点 .
您可以将id乘以golden ratio(phi)以获得数字0 <= n <1 . 您生成的所有数字将趋于均匀分布 .
然后是将该数字转换为颜色的问题,例如
图形设计人员知道,如果在信息显示中要将许多颜色彼此靠近使用,则颜色空间中的颜色应该相对接近 . 饱和度或色调的微小变化通常比大跳跃更好 - 当涉及许多颜色时,人眼实际上发现当颜色距离不是很大时更容易吸收信息 .
此外,不要忘记您的一些用户将是色盲 . 由于色盲的种类繁多,很难知道要避免哪种组合 . 也许其他人可以解决这个问题?
我写了一篇关于同一主题的文章:
How to Generate Random Colors Programmatically
基本上你可以使用HSV颜色空间,设置固定的饱和度和值,并修改Hue . 当您知道所需的颜色数量时,只需将Hue的范围分开
[0,1[
即可 . 如果您不知道所需颜色的数量,您仍然可以使用黄金比例从该空间中选择颜色 .