4

我有一个拥有大约一百个用户的应用程序。我们有一个日历视图,其中每个用户都可以有多个条目。同一个用户的每个条目应该有相同的颜色,但不同的用户应该有不同的颜色。目前我们在一个数组中手动​​定义了大约 25 种颜色,用户获得的颜色由

$color = $colors[$userid % count($colors)];

我们不想为每个新用户手动添加颜色,为每个用户选择颜色似乎也有点乏味。

是否有一个简单的函数可以将数字(用户 ID)映射到颜色(最好是 RGB)?下一个问题是;有没有办法将功能限制为特定类型的颜色(即只有白色字母可读的颜色)?

4

2 回答 2

3

我本身没有解决方案,但有一个建议。

首先,由于您希望每个用户的颜色都是唯一的但随机的,您可以从某种数字哈希函数开始。这会给你一个很可能是唯一的随机数。如果您的散列函数不错,并且您的用户有数百个就足够了。

现在你需要把它变成颜色,最好是在光谱的暗端。如果您使用 RGB,则需要三个数字。为了使它们保持黑暗,假设您将总数或 R、G 和 B 保持在 200 以下。当然,这是一个猜测,但它应该很暗。选择一个介于 1 和 3 之间的随机数 [index] - 这就是您要开始的 R、G 或 B。获取一个介于 0 到 200 之间的数字,并将其设置为 color[index1]。现在选择剩余的索引之一,1-3。为此,请选择一个介于 0 和 color[index1] 之间的数字。将剩余数量设置为 200-color[index1]-color[index2]。现在你有一个随机的 RGB 值,应该与白色形成对比。

我意识到我从来没有从那个哈希函数中得到太多用处——也许放弃它,只是使用用户 ID 作为随机(种子)。

于 2012-04-19T14:00:08.837 回答
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 之间的转换是一个有据可查的过程。

PHP HSV转RGB公式理解

于 2012-04-19T14:58:19.610 回答