首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成随机颜色

生成随机颜色
EN

Stack Overflow用户
提问于 2012-02-10 09:15:00
回答 2查看 1.1K关注 0票数 0

我想为我的折线图生成6位随机颜色,每条线一个。现在我在Map中有一个颜色列表,每个事件行都有一个固定的颜色列表,但是现在事件可以是动态的,而不仅仅是这个列表中的,所以我不能执行ColorMap.get( eventname ),因为eventname可能是全新的,并且不在地图中。例如,我需要生成随机颜色或从事件名称生成颜色。我应该使用Math.random(),还是他们是更简单的方法?

我如何在groovy中做到这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-10 12:20:14

我假设你说的6位数指的是像#ff0000 (红色)这样的十六进制代码。如果你把它们看作是随机的24位整数,那么生成这样的随机代码是非常简单的。也就是说,0到2^24 - 1之间的随机数。如下所示:

代码语言:javascript
复制
def randomRgbCode() {
    def rgb = new Random().nextInt(1 << 24) // A random 24-bit integer
    '#' + Integer.toString(rgb, 16).padLeft(6, '0')
}

这些东西生成的颜色代码是相当随机的,但看起来不是很好;许多灰色的颜色是由一些鲜艳的颜色组成的。These are一些由该函数生成的颜色。

用随机RGB值代替HSL可以获得更生动的色彩,例如生成随机色调、高饱和度和中等亮度。如果您使用这些颜色作为CSS样式,那么很容易生成颜色代码,就像CSS now supports HSL values一样。

代码语言:javascript
复制
def randomHslCode() {
    def rnd = new Random()
    def h = rnd.nextInt(360)
    int s = 65 + rnd.nextInt(35)  // Quite saturated
    def l = 50
    "hsl($h, $s%, $l%)"
}

These are由这个新函数生成的一些颜色。如你所见,更加生动。

现在,如果您不打算在CSS样式中使用颜色代码,并且需要生成RGB代码,那么您可能会生成如上所述的随机HSL值,然后将这些值转换为RGB。这个过程是quite straightforward的,但需要更多的编码:

代码语言:javascript
复制
import static Math.abs
def floor(x) { x as int }

def randomVividRgbCode() {
    def rnd = new Random()
    def h = rnd.nextFloat()
    def s = 0.65f + rnd.nextFloat() * 0.35f // Quite saturated
    def l = 0.5f
    rgbToColorCode(*hslToRgb(h, s, l))
}

def rgbToColorCode(r, g, b) {
    def rgb = floor(r * 255) << 16 | 
              floor(g * 255) << 8  | 
              floor(b * 255)
    '#' + Integer.toString(rgb, 16).padLeft(6, '0')
}

def hslToRgb(h, s, l) {
    def c = (1 - abs(2 * l - 1)) * s // Chroma.
    def h1 = h * 6
    def x = c * (1 - abs(h1 % 2 - 1))
    def rgb = h1 < 1 ? [c, x, 0] :
              h1 < 2 ? [x, c, 0] :
              h1 < 3 ? [0, c, x] :
              h1 < 4 ? [0, x, c] :
              h1 < 5 ? [x, 0, c] :
                       [c, 0, x]
    def (r, g, b) = rgb
    def m = l - c * 0.5
    [r + m, g + m, b + m]
}

我希望代码不是那么神秘:)。These are一些由它产生的颜色。

现在,您可能会注意到,一些生成的颜色非常相似,如果您想要区分图表中的线条,这可能不是很好。为了避免这种情况,你可以做的是有一个很好的调色板预先定义的和容易区分的颜色(你可以在互联网上找到很多),并从那里挑选颜色。如果调色板中的颜色用完了(可能对图表中的线条数量没有限制),则可以使用上面描述的一些方法或任何其他方法生成随机颜色:)

票数 6
EN

Stack Overflow用户

发布于 2012-02-10 09:21:48

如果您有一个特定的值间隔,则需要从以下位置随机提取:

代码语言:javascript
复制
random = new Random()
randomInt = random.nextInt((max_value)-(min_value)+1)+(min_value)

对于更接近真实的随机,您可以在Random()中插入一个种子值。建议拉取当前系统时间戳。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9221414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档