我的应用程序有大约一百个用户。我们有一个日历视图,其中每个用户可以有多个条目。同一用户的每个条目应具有相同的颜色,但不同的用户应具有不同的颜色。目前我们在一个数组中手动定义了大约25种颜色,用户获得的颜色由
决定$color = $colors[$userid % count($colors)];
我们不想为每个新用户手动添加颜色,为每个用户选择颜色似乎也有点乏味。
是否有一个简单的函数可以将数字(用户ID)映射到颜色(最好是RGB)?下一个问题是:有没有办法将函数限制为某种类型的颜色(即只有白色字母可读的颜色)?
答案 0 :(得分:3)
我本身没有解决方案,但建议。
首先,由于您希望每个用户的颜色都是唯一但随机的,您可以开始使用某种数字哈希函数。这会得到一个最有可能是随机数的随机数。如果您的哈希函数是合适的,并且您的用户数量已经达到数百个就足够了。
现在您需要将其转换为颜色,最好是在光谱的暗端。如果使用RGB,则需要三个数字。为了让它们保持黑暗,让我们说你保持总数或者R,G和B低于200.这当然是猜测,但它应该是非常黑暗的。选择1到3之间的随机数[index] - 这是你要开始的R,G或B.获取0到200之间的数字,并将其记录为颜色[index1]。现在选择剩下的一个索引,1-3。为此,选择一个介于0和颜色[index1]之间的数字。将剩余数字设置为200色[index1] -color [index2]。现在你有一个随机的RGB值,应与白色对比。
我意识到我从来没有从前面的哈希函数中得到太多使用 - 可能会抛弃它并且只使用userid作为随机(种子)。
答案 1 :(得分:2)
您希望使用色调饱和度 - 亮度或色调 - 饱和度 - 值(HSL或HSV)空间。
http://en.wikipedia.org/wiki/HSL_and_HSV
首先根据色调和饱和度定义一些颜色,然后将亮度设置为使文本可读的最高容许级别。
然后你可以修复这些颜色的色调和饱和度并降低亮度。
所以说你开始选择25种具有不同色调和最大/最小可容忍亮度的可容忍颜色。
要为索引生成颜色,请选择以base = id % 25
开头的基色然后根据该颜色index = (Math.floor(id/25))
内的索引降低亮度。根据该值将亮度设置在容许亮度范围内。因此,假设每种颜色有5个亮度值,将亮度设置为
lightness = maxLightness - index*(maxLightness / 4*minLightness)
这简单地改变了每种颜色的亮度。如果您愿意,可以选择稍微改变饱和度和色调。在HSV和RGB之间进行转换是一个记录良好的程序。