Согласно 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, или возникает ошибка времени компиляции.
В основном общий метод для плавного перехода между двумя значениями является следующей функцией:
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))
red = (float)val / 200 * 255;
green = (float)(200 - val) / 200 * 255;
blue = 0;
return red << 16 + green << 8 + blue;
Вы не говорите, в какой среде Вы делаете это. Если бы можно работать с цвета HSV , этим было бы довольно легко сделать установкой S = 100 и V = 100, и определение H:
H = 0.4 * value + 120
Преобразование от HSV до RGB также довольно легко.
[РЕДАКТИРОВАНИЕ] Примечание: в отличие от некоторых других предлагаемых решений, это изменит цветной зеленый-> желтый-> оранжевый-> красный.
Выберите зеленый, который Вы любите (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
При использовании линейных пандусов для значений Красного и Green как предложенный Peter Parker цвет для значения 100 в основном будет , рвут зеленые (127, 127, 0). Вы идеально хотите, чтобы это было ярко-оранжевым или желтым в той средней точке. Для этого можно использовать:
Red = max(value / 100, 1) * 255
Green = (1 - max(value / 100, 1)) * 255
Blue = 0
Просмотр эта статья Википедии я лично выбрал бы путь через цветовое пространство и отобразил бы значения на тот путь.
, Но это - прямая функция. Я думаю, что Вы могли бы лучше подходить для выбора цвета JavaScript, который можно найти с быстрым цветом, который даст Вам Шестнадцатеричное число, и можно сохранить Шестнадцатеричное число.
Для лучшего управляемого и точного эффекта необходимо использовать цветовое пространство HSV. С HSV можно легко масштабировать Оттенок, Насыщенность и/или Яркость, отдельную друг от друга. Затем Вы делаете преобразование к RGB.