Генерация случайного цвета - PullRequest
0 голосов
/ 10 февраля 2012

Я хотел бы сгенерировать 6-значные случайные цвета для моих линейных диаграмм по одному для каждой линии. сейчас у меня есть список цветов на карте, фиксированный для каждой строки события, но теперь событие может быть динамическим, и не только из этого списка, поэтому я не могу сделать ColorMap.get (eventname), так как имя события может быть совершенно новым и не на карте. Мне нужно, чтобы генерировать случайный цвет или цвет из имени события, например. я должен использовать Math.random () или это более простой способ?

Как я могу сделать это в Groovy?

Ответы [ 2 ]

6 голосов
/ 10 февраля 2012

Я предполагаю, что под 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')
}

Код цвета, который генерирует эта вещь, довольно случайный, но выглядит не очень хорошо;много серых цветов, закрашенных яркими. Это некоторые цвета, сгенерированные этой функцией.

Более яркие цвета могут быть достигнуты при случайных значениях HSL вместо RGB, например, при генерации случайных оттенков, высокой насыщенностии средняя легкость.Если вы используете эти цвета для стиля CSS, то довольно просто сгенерировать цветовые коды, так как CSS теперь поддерживает значения HSL :

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%)"
}

Это некоторые цвета, сгенерированные этой новой функцией.Как видите, гораздо ярче.

Теперь, если вы не собираетесь использовать цветовые коды в стилях CSS и вам нужно для генерации кодов RGB, вы можете сгенерировать случайный HSLзначения, как описано выше, а затем преобразовать эти значения в RGB.Процесс довольно прост , но требует немного больше кодирования:

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]
}

Я надеюсь, что код не такой загадочный :). Это некоторые цвета, сгенерированные им.


Теперь вы можете заметить, что некоторые из сгенерированных цветов очень похожи, что может быть не очень хорошо, если вы хотите различитьлинии на графике.Что вы можете сделать, чтобы избежать этого, это иметь хороший поддон заранее определенных и легко различимых цветов (вы можете найти их в Интернете) и выбирать цвета оттуда.Если у вас заканчиваются цвета из палитры (возможно, нет ограничений на количество линий на диаграмме), вы можете затем создать случайный цвет, используя один из методов, описанных выше, или любой другой:)

0 голосов
/ 10 февраля 2012

Если у вас есть определенный интервал значений, который вам нужно получить случайным образом из:

random = new Random()
randomInt = random.nextInt((max_value)-(min_value)+1)+(min_value)

Для случайного значения, близкого к реальному, вы можете вставить начальное значение в Random ().Я рекомендую вытянуть текущую системную временную метку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...