我想为我的折线图生成6位随机颜色,每条线一个。现在我在Map中有一个颜色列表,每个事件行都有一个固定的颜色列表,但是现在事件可以是动态的,而不仅仅是这个列表中的,所以我不能执行ColorMap.get( eventname ),因为eventname可能是全新的,并且不在地图中。例如,我需要生成随机颜色或从事件名称生成颜色。我应该使用Math.random(),还是他们是更简单的方法?
我如何在groovy中做到这一点呢?
发布于 2012-02-10 12:20:14
我假设你说的6位数指的是像#ff0000 (红色)这样的十六进制代码。如果你把它们看作是随机的24位整数,那么生成这样的随机代码是非常简单的。也就是说,0到2^24 - 1之间的随机数。如下所示:
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一样。
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的,但需要更多的编码:
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一些由它产生的颜色。
现在,您可能会注意到,一些生成的颜色非常相似,如果您想要区分图表中的线条,这可能不是很好。为了避免这种情况,你可以做的是有一个很好的调色板预先定义的和容易区分的颜色(你可以在互联网上找到很多),并从那里挑选颜色。如果调色板中的颜色用完了(可能对图表中的线条数量没有限制),则可以使用上面描述的一些方法或任何其他方法生成随机颜色:)
发布于 2012-02-10 09:21:48
如果您有一个特定的值间隔,则需要从以下位置随机提取:
random = new Random()
randomInt = random.nextInt((max_value)-(min_value)+1)+(min_value)对于更接近真实的随机,您可以在Random()中插入一个种子值。建议拉取当前系统时间戳。
https://stackoverflow.com/questions/9221414
复制相似问题