Функция масштабирования цвета

Согласно Sun Java Specification , он называется Условным оператором. См. Раздел 15.25. Вы правы в том, что он делает.

Условный оператор? : использует логическое значение одного выражения для определения того, какое из двух других выражений должно быть оценено.

Условный оператор синтаксически право-ассоциативный (он группируется справа налево), так что a? b: c? d: e? f: g означает то же, что и b: (c? d: (e? f: g)).

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

Условный оператор имеет три выражения операнда; ? появляется между первым и вторым выражениями и появляется между вторым и третьим выражениями.

Первое выражение должно иметь тип boolean или Boolean, или возникает ошибка времени компиляции.

14
задан Jon Seigel 10 April 2010 в 19:28
поделиться

7 ответов

В основном общий метод для плавного перехода между двумя значениями является следующей функцией:

function transition(value, maximum, start_point, end_point):
    return start_point + (end_point - start_point)*value/maximum

, Что данный, Вы определяете функцию, которая делает переход для триплетов (RGB, HSV и т.д.).

function transition3(value, maximum, (s1, s2, s3), (e1, e2, e3)):
    r1= transition(value, maximum, s1, e1)
    r2= transition(value, maximum, s2, e2)
    r3= transition(value, maximum, s3, e3)
    return (r1, r2, r3)

Принятие у Вас есть цвета RGB для s и e триплеты, можно использовать функцию transition3 как есть. Однако прохождение через цветового пространства HSV производит более "естественные" переходы. Так, учитывая функции преобразования (украденный бесстыдно от Python colorsys модуль и преобразованный в псевдокод :):

function rgb_to_hsv(r, g, b):
    maxc= max(r, g, b)
    minc= min(r, g, b)
    v= maxc
    if minc == maxc then return (0, 0, v)
    diff= maxc - minc
    s= diff / maxc
    rc= (maxc - r) / diff
    gc= (maxc - g) / diff
    bc= (maxc - b) / diff
    if r == maxc then
        h= bc - gc
    else if g == maxc then
        h= 2.0 + rc - bc
    else
        h = 4.0 + gc - rc
    h = (h / 6.0) % 1.0 //comment: this calculates only the fractional part of h/6
    return (h, s, v)

function hsv_to_rgb(h, s, v):
    if s == 0.0 then return (v, v, v)
    i= int(floor(h*6.0)) //comment: floor() should drop the fractional part
    f= (h*6.0) - i
    p= v*(1.0 - s)
    q= v*(1.0 - s*f)
    t= v*(1.0 - s*(1.0 - f))
    if i mod 6 == 0 then return v, t, p
    if i == 1 then return q, v, p
    if i == 2 then return p, v, t
    if i == 3 then return p, q, v
    if i == 4 then return t, p, v
    if i == 5 then return v, p, q
    //comment: 0 <= i <= 6, so we never come here

, у Вас может быть код как следующее:

start_triplet= rgb_to_hsv(0, 255, 0) //comment: green converted to HSV
end_triplet= rgb_to_hsv(255, 0, 0) //comment: accordingly for red

maximum= 200

… //comment: value is defined somewhere here

rgb_triplet_to_display= hsv_to_rgb(transition3(value, maximum, start_triplet, end_triplet))
17
ответ дан 1 December 2019 в 07:06
поделиться
red = (float)val / 200 * 255;

green = (float)(200 - val) / 200 * 255;

blue = 0;

return red << 16 + green << 8 + blue;
7
ответ дан 1 December 2019 в 07:06
поделиться

Вы не говорите, в какой среде Вы делаете это. Если бы можно работать с цвета HSV , этим было бы довольно легко сделать установкой S = 100 и V = 100, и определение H:

H = 0.4 * value + 120

Преобразование от HSV до RGB также довольно легко.

[РЕДАКТИРОВАНИЕ] Примечание: в отличие от некоторых других предлагаемых решений, это изменит цветной зеленый-> желтый-> оранжевый-> красный.

7
ответ дан 1 December 2019 в 07:06
поделиться

Выберите зеленый, который Вы любите (RGB1 = # 00FF00, например) и Красный, которого Вы любите (RGB2 = #FF0000, например) и затем вычисляете цвет как это

R = R1 * (200-i)/200 + R2 * i/200
G = G1 * (200-i)/200 + G2 * i/200
B = B1 * (200-i)/200 + B2 * i/200
3
ответ дан 1 December 2019 в 07:06
поделиться

При использовании линейных пандусов для значений Красного и Green как предложенный Peter Parker цвет для значения 100 в основном будет , рвут зеленые (127, 127, 0). Вы идеально хотите, чтобы это было ярко-оранжевым или желтым в той средней точке. Для этого можно использовать:

Red = max(value / 100, 1) * 255
Green = (1 - max(value / 100, 1)) * 255
Blue = 0
0
ответ дан 1 December 2019 в 07:06
поделиться

Просмотр эта статья Википедии я лично выбрал бы путь через цветовое пространство и отобразил бы значения на тот путь.

, Но это - прямая функция. Я думаю, что Вы могли бы лучше подходить для выбора цвета JavaScript, который можно найти с быстрым цветом, который даст Вам Шестнадцатеричное число, и можно сохранить Шестнадцатеричное число.

1
ответ дан 1 December 2019 в 07:06
поделиться

Для лучшего управляемого и точного эффекта необходимо использовать цветовое пространство HSV. С HSV можно легко масштабировать Оттенок, Насыщенность и/или Яркость, отдельную друг от друга. Затем Вы делаете преобразование к RGB.

2
ответ дан 1 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

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