Как генерировать случайные 'зеленоватые' цвета

MySQL isn’t обязательно хороший в выборе соединения заказывает в сложных запросах. Путем определения сложного запроса как straight_join запрос выполняет соединения в порядке they’re указанный. Путем размещения таблицы, чтобы быть наименее общим знаменателем сначала и определения straight_join Вас могут улучшить производительность запросов.

33
задан Echo says Reinstate Monica 18 October 2009 в 22:00
поделиться

9 ответов

Простое решение: Используйте цветовое пространство HSL или HSV вместо rgb (преобразуйте его в RGB позже, если вам это нужно). Разница заключается в значении кортежа: где RGB означает значения для красного, зеленого и синего, в HSL H - это цвет (например, 120 градусов или 0,33, означающий зеленый), а S - для насыщенности, а V - для яркости. Так что оставьте H на фиксированном значении (или для еще большего количества случайных цветов вы можете рандомизировать его, добавив / добавив небольшое случайное число) и рандомизируйте S и V. См. Статью википедии .

54
ответ дан 27 November 2019 в 17:32
поделиться

Вы хотите работать в терминах HSL вместо RGB. Вы можете найти диапазон оттенков, который соответствует «зеленоватому», и выбрать из него случайный оттенок. Вы также можете выбрать случайную насыщенность и яркость, но вы, вероятно, захотите, чтобы ваша насыщенность была около 1, а яркость - около 0,5, но вы можете поиграть с ними.

Ниже приведен код ActionScript для преобразования HSL в RGB. Я давно не прикасался к python, иначе он опубликовал бы версию python.

Я обнаружил, что зеленоватый цвет - это примерно от 0,47 * PI до 0,8 * PI.

    /**
@param h hue [0, 2PI]
@param s saturation [0,1]
@param l lightness [0,1]
@return object {r,g,b} {[0,1],[0,1][0,1]}
*/
public function hslToRGB(h:Number, s:Number, l:Number):Color
{
    var q:Number = (l<0.5)?l*(1+s):l+s-l*s;
    var p:Number = 2*l-q;
    var h_k:Number = h/(Math.PI*2);
    var t_r:Number = h_k+1/3;
    var t_g:Number = h_k;
    var t_b:Number = h_k-1/3;
    if (t_r < 0) ++t_r; else if (t_r > 1) --t_r;
    if (t_g < 0) ++t_g; else if (t_g > 1) --t_g;
    if (t_b < 0) ++t_b; else if (t_b > 1) --t_b;
    var c:Color = new Color();
    if (t_r < 1/6) c.r = p+((q-p)*6*t_r);
    else if (t_r < 1/2) c.r = q;
    else if (t_r < 2/3) c.r = p+((q-p)*6*(2/3-t_r));
    else c.r = p;
    if (t_g < 1/6) c.g = p+((q-p)*6*t_g);
    else if (t_g < 1/2) c.g = q;
    else if (t_g < 2/3) c.g = p+((q-p)*6*(2/3-t_g));
    else c.g = p;
    if (t_b < 1/6) c.b = p+((q-p)*6*t_b);
    else if (t_b < 1/2) c.b = q;
    else if (t_b < 2/3) c.b = p+((q-p)*6*(2/3-t_b));
    else c.b = p;
    return c;
}
1
ответ дан 27 November 2019 в 17:32
поделиться

Как предлагали другие, генерация случайных цветов намного проще в цветовом пространстве HSV (или HSL, разница здесь не имеет значения)

Итак, код для генерации случайного «зеленого» ish "цвета, и (в демонстрационных целях) отображать их как серию простых цветных тегов HTML span:

#!/usr/bin/env python2.5
"""Random green colour generator, written by dbr, for
http://stackoverflow.com/questions/1586147/how-to-generate-random-greenish-colors
"""

def hsv_to_rgb(h, s, v):
    """Converts HSV value to RGB values
    Hue is in range 0-359 (degrees), value/saturation are in range 0-1 (float)

    Direct implementation of:
    http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_HSV_to_RGB
    """
    h, s, v = [float(x) for x in (h, s, v)]

    hi = (h / 60) % 6
    hi = int(round(hi))

    f = (h / 60) - (h / 60)
    p = v * (1 - s)
    q = v * (1 - f * s)
    t = v * (1 - (1 - f) * s)

    if hi == 0:
        return v, t, p
    elif hi == 1:
        return q, v, p
    elif hi == 2:
        return p, v, t
    elif hi == 3:
        return p, q, v
    elif hi == 4:
        return t, p, v
    elif hi == 5:
        return v, p, q

def test():
    """Check examples on..
    http://en.wikipedia.org/wiki/HSL_and_HSV#Examples
    ..work correctly
    """
    def verify(got, expected):
        if got != expected:
            raise AssertionError("Got %s, expected %s" % (got, expected))

    verify(hsv_to_rgb(0, 1, 1), (1, 0, 0))
    verify(hsv_to_rgb(120, 0.5, 1.0), (0.5, 1, 0.5))
    verify(hsv_to_rgb(240, 1, 0.5), (0, 0, 0.5))

def main():
    """Generate 50 random RGB colours, and create some simple coloured HTML
    span tags to verify them.
    """
    test() # Run simple test suite

    from random import randint, uniform

    for i in range(50):
        # Tweak these values to change colours/variance
        h = randint(90, 140) # Select random green'ish hue from hue wheel
        s = uniform(0.2, 1)
        v = uniform(0.3, 1)

        r, g, b = hsv_to_rgb(h, s, v)

        # Convert to 0-1 range for HTML output
        r, g, b = [x*255 for x in (r, g, b)]

        print "<span style='background:rgb(%i, %i, %i)'>&nbsp;&nbsp;</span>" % (r, g, b)

if __name__ == '__main__':
    main()

Результат (при просмотре в веб-браузере) должен выглядеть примерно так:

Example output, showing random green colours

Edit : Я не знал о модуле colorsys. Вместо указанной выше функции hsv_to_rgb вы можете использовать colorsys.hsv_to_rgb , что делает код намного короче (это не совсем простая замена, как мой hsv_to_rgb ] ожидает, что оттенок будет в градусах вместо 0-1):

#!/usr/bin/env python2.5
from colorsys import hsv_to_rgb
from random import randint, uniform

for x in range(50):
    h = uniform(0.25, 0.38) # Select random green'ish hue from hue wheel
    s = uniform(0.2, 1)
    v = uniform(0.3, 1)

    r, g, b = hsv_to_rgb(h, s, v)

    # Convert to 0-1 range for HTML output
    r, g, b = [x*255 for x in (r, g, b)]

    print "<span style='background:rgb(%i, %i, %i)'>&nbsp;&nbsp;</span>" % (r, g, b)
21
ответ дан 27 November 2019 в 17:32
поделиться

Если вы используете RGB, вам просто нужно убедиться, что значение G больше, чем R и B, и постараться сохранить одинаковые значения синего и красного, чтобы оттенок не стал слишком сумасшедшим. Расширение от Slaks, может быть что-то вроде (я почти ничего не знаю о Python):

greenval = randint(100, 255)
redval = randint(20,(greenval - 60))
blueval = randint((redval - 20), (redval + 20))
color = (redval, greenval, blueval)
9
ответ дан 27 November 2019 в 17:32
поделиться

Итак, в этом случае вам повезло. желательно вариации основного цвета, но для художественного использования, подобного этому, лучше указать координаты цветового круга, а не величины основного цвета.

Возможно, вам понадобится что-то из модуля colorsys , например:

colorsys.hsv_to_rgb(h, s, v)
    Convert the color from HSV coordinates to RGB coordinates.
5
ответ дан 27 November 2019 в 17:32
поделиться

Самый простой способ сделать это - убедиться, что красный и синий компоненты совпадают, например: (Простите мой Python)

rb = randint(100, 200)
color = (rb, randint(120, 255), rb)
0
ответ дан 27 November 2019 в 17:32
поделиться

Ознакомьтесь с модулем colorsys :

http://docs.python.org/library/colorsys.html

Используйте цветовое пространство HSL или HSV . Произведите случайный выбор оттенка, чтобы он был близок к зеленому, затем выберите совершенно случайный материал для насыщенности и V (яркости).

16
ответ дан 27 November 2019 в 17:32
поделиться

решение с цветовым пространством HSx очень хорошее. Однако, если вам нужно что-то чрезвычайно упрощенное и у вас нет особых требований к распределению цветов (например, однородности), упрощенное решение на основе RGB будет заключаться в том, чтобы убедиться, что значение G больше, чем R и B

rr = randint(100, 200)
rb = randint(100, 200)
rg = randint(max(rr, rb) + 1, 255)

. подарит вам «зеленоватые» цвета. Некоторые из них будут слегка зеленоватыми. Вы можете повысить гарантированную степень зеленоватого оттенка, увеличив (абсолютно или относительно) нижнюю границу в последнем вызове randint .

3
ответ дан 27 November 2019 в 17:32
поделиться

Я бы пошел с подходом HSV все остальные упомянули.

0
ответ дан 27 November 2019 в 17:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: