Случайный цвет HSV

Я пытаюсь получить случайный цвет HSV, а затем преобразовать его в RGB для использования. Есть ли у кого-нибудь идеи о том, как я могу это сделать? Спасибо, Сэм. Что у меня есть на данный момент: первый метод преобразует HSV в RGB с указанными значениями, второй метод предназначен для получения случайного цвета.

public static float[] HSVtoRGB(float h, float s, float v) {
    float m, n, f;
    int i;

    float[] hsv = new float[3];
    float[] rgb = new float[3];

    hsv[0] = h;
    hsv[1] = s;
    hsv[2] = v;

    if (hsv[0] == -1) {
        rgb[0] = rgb[1] = rgb[2] = hsv[2];
        return rgb;
    }
    i = (int) (Math.floor(hsv[0]));
    f = hsv[0] - i;
    if (i % 2 == 0) {
        f = 1 - f; // if i is even
    }
    m = hsv[2] * (1 - hsv[1]);
    n = hsv[2] * (1 - hsv[1] * f);
    switch (i) {
        case 6:
        case 0:
            rgb[0] = hsv[2];
            rgb[1] = n;
            rgb[2] = m;
            break;
        case 1:
            rgb[0] = n;
            rgb[1] = hsv[2];
            rgb[2] = m;
            break;
        case 2:
            rgb[0] = m;
            rgb[1] = hsv[2];
            rgb[2] = n;
            break;
        case 3:
            rgb[0] = m;
            rgb[1] = n;
            rgb[2] = hsv[2];
            break;
        case 4:
            rgb[0] = n;
            rgb[1] = m;
            rgb[2] = hsv[2];
            break;
        case 5:
            rgb[0] = hsv[2];
            rgb[1] = m;
            rgb[2] = n;
            break;
    }
    return rgb;
}

public static int randomColor() {
    int hue = (int) (Math.random() * 6.0f);
    int saturation = (int) (Math.random());
    int brightness = (int) (Math.random());

    float[] rgb = HSVtoRGB(hue, saturation, brightness);

    int red = (int) (rgb[0] * 255.0f);
    int green = (int) (rgb[1] * 255.0f);
    int blue = (int) (rgb[2] * 255.0f);

    return (red << 16) | (green << 8) | blue;
}

person user1009569    schedule 10.07.2013    source источник


Ответы (1)


Вы можете использовать java.awt.Color.RGBtoHSB(...) Соответствующую документацию для него можно найти здесь: http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Color.html

Тогда становится просто генерировать случайный цвет.

int red = (int) (Math.random() * 256)
int green = (int) (Math.random() * 256)
int blue = (int) (Math.random() * 256)

Затем конвертируйте напрямую. Обратите внимание, что в том же классе есть функция HSBtoRGB(...).

person Kon    schedule 10.07.2013
comment
Нет, я хочу сгенерировать случайное значение HSV. Я не хочу получать случайные значения RGB, а затем преобразовывать их в HSV и обратно. - person user1009569; 10.07.2013
comment
Предположительно, вы могли бы легко сгенерировать случайное значение RGB, как показано в моем фрагменте выше, а затем преобразовать эти значения RGB в значение HSB. Я понятия не имею, что такое HSV, и Google подтверждает, что вы, вероятно, имеете в виду HSB. См. здесь: stackoverflow.com/questions/2399150/convert- rgb-значение-в-hsv - person Kon; 10.07.2013
comment
Да, HSV и HSB одинаковы, и мне нужно получить случайные значения для HSB. Ваш ответ правильный, но мне нужны случайные значения HSB, спасибо. - person user1009569; 10.07.2013
comment
Если вам нужно напрямую сгенерировать случайные значения HSB, вам нужно знать верхнюю и нижнюю границы оттенка, насыщенности и яркости. Поскольку это значения с плавающей запятой, я предполагаю, что все 3 значения идут от 0 до 1? Если это так, то вы генерируете каждый по отдельности с помощью h = Math.random(), s = Math.random(), b = Math.random(), так как это генерирует случайное двойное значение между 0 и 1, которое вы можете явно использовать на поплавок или что вам нужно. - person Kon; 10.07.2013
comment
Большое спасибо, граница оттенка равна 6, поэтому у меня есть int hue = (int) (Math.random() * 6.0f); а у меня, к сожалению, не работает :(. - person user1009569; 10.07.2013
comment
Я вижу твою проблему. Вы конвертируете в значения HSB, которые вы генерируете с помощью Math.random(), в целые числа явно. Вам нужно сохранить эти значения в float или double. Помните, что Math.random() возвращает значение с плавающей запятой от 0 до 1. Итак, предположим, что он возвращает что-то вроде 0,335351, ну, вы сразу же приводите его к (int), так что каждый раз он становится 0. Храните его в поплавке и ни к чему не бросайте. - person Kon; 10.07.2013
comment
Я чувствую себя глупо, ха-ха, спасибо, что указали на это - person user1009569; 10.07.2013
comment
Нет проблем, надеюсь, теперь это работает - person Kon; 10.07.2013
comment
Да это оно! Большое спасибо! - person user1009569; 10.07.2013