Básicamente, el método general para la transición suave entre dos valores es la siguiente función:
function transition(value, maximum, start_point, end_point):
return start_point + (end_point - start_point)*value/maximum
Eso dado, se define una función que hace la transición para los tríos (RGB, HSV etc).
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)
Asumiendo que tiene los colores RGB para el s y e trillizos, puede utilizar la función transition3 tal cual. Sin embargo, pasar por el espacio de color HSV produce más transiciones "naturales". Por lo tanto, teniendo en cuenta las funciones de conversión (robados descaradamente desde el módulo colorsys Python y convertido a Pseudocódigo :):
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
, puede hacer que el código de la siguiente manera:
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))
+1; Iba a hacer una nueva pregunta sobre cómo mejorar un algoritmo de color que tengo para colorear un gráfico de barras en HTML/PHP ... SO sugirió esta pregunta como similar y su respuesta me ayudó a solucionar el problema sin tener que hacer la pregunta. ¡Gracias! – beggs
+1, y un nombre mejor para su función 'transition' sería' lerp' ya que matemáticamente se trata de lo que está haciendo: http://en.wikipedia.org/wiki/Lerp_(computing) – Keith