Estoy escribiendo un juego Java y quiero implementar un medidor de potencia para determinar qué tan duro vas a disparar algo.
Necesito escribir una función que tome un int entre 0 y 100, y en función de qué tan alto sea ese número, devolverá un color entre Verde (0 en la escala de potencia) y Rojo (100 en la escala de potencia).
Similar a cómo funcionan los controles de volumen:
¿Qué operación debo hacer en los componentes Rojo, Verde y Azul de un color para generar los colores entre Verde y Rojo?
Entonces, podría ejecutar say, getColor(80)
y devolverá un color anaranjado (sus valores en R, G, B) o getColor(10)
que devolverá un valor RGB más verde / amarillo.
Sé que necesito aumentar los componentes de los valores R, G, B para un nuevo color, pero no sé específicamente qué sube o baja a medida que los colores cambian de Verde a Rojo.
Progreso:
Terminé usando el espacio de color HSV / HSB porque me gustaba más el gradiant (no hay marrones oscuros en el medio).
La función que utilicé fue:
public Color getColor(double power)
{
double H = power * 0.4; // Hue (note 0.4 = Green, see huge chart below)
double S = 0.9; // Saturation
double B = 0.9; // Brightness
return Color.getHSBColor((float)H, (float)S, (float)B);
}
Donde "potencia" es un número entre 0.0 y 1.0. 0.0 devolverá un rojo brillante, 1.0 devolverá un verde brillante.
Java Hue Chart:
Respuestas:
Esto debería funcionar, solo escale linealmente los valores rojo y verde. Asumiendo que su valor máximo rojo / verde / azul está
255
yn
está dentro del rango0 .. 100
(Modificado para matemáticas enteras, punta del sombrero para Ferrucio)
Otra forma de hacerlo sería utilizar un modelo de color HSV y cambiar el tono de
0 degrees
(rojo) a120 degrees
(verde) con la saturación y el valor que le convenga. Esto debería dar un gradiente más agradable.Aquí hay una demostración de cada técnica: el gradiente superior usa RGB, el inferior usa HSV:
fuente
En la parte superior de mi cabeza, aquí está la transición de tono verde-rojo en el espacio HSV, traducida a RGB:
Los valores rojo, verde y azul en el ejemplo anterior son porcentajes, probablemente desee multiplicarlos por 255 para obtener el rango 0-255 más utilizado.
fuente
Respuesta breve de copiar y pegar ...
En Java Std:
En Android:
nota: el valor es un número entre 0 y 1 que indica la condición de rojo a verde.
fuente
String.format("#%06X", 0xFFFFFF & getTrafficlightColor(value));
Si desea una representación verde-amarilla-roja como sugiere la respuesta aceptada, eche un vistazo a esto.
http://jsfiddle.net/0awncw5u/2/
fuente
La interpolación lineal entre verde y rojo casi debería funcionar, excepto que en el medio habrá un color marrón fangoso.
La solución más flexible y de mejor aspecto es tener un archivo de imagen en algún lugar que tenga la rampa de color exacta que desea. Y luego busque el valor de píxel allí. Esto tiene la flexibilidad de que puede ajustar el gradiente para que sea perfecto .
Si aún desea hacerlo desde el código, entonces probablemente sea mejor interpolar entre los colores verde y amarillo en el lado izquierdo, y entre amarillo y rojo en el lado derecho. En el espacio RGB, el verde es (R = 0, G = 255, B = 0), el amarillo es (R = 255, G = 255, B = 0), el rojo es (R = 255, G = 0, B = 0 ): se supone que cada componente de color va de 0 a 255.
fuente
Hice una pequeña función que le da el valor entero rgb para un valor porcentual:
Entonces, si su valor actual es 50 y su valor máximo es 100, esta función le devolverá el color que necesita, por lo que si realiza un bucle de esta función con un valor porcentual, su valor de color pasará de verde a rojo. Perdón por la mala explicación.
fuente
La respuesta aceptada ni siquiera respondió la pregunta ...
C ++
Aquí hay un segmento de código C ++ simple de mi motor que interpola lineal y eficientemente entre tres colores arbitrarios:
Se
interpolation_factor
supone que está en el rango de0.0 ... 1.0
.Se supone que los colores están en el rango de
0.0 ... 1.0
(por ejemplo, para OpenGL).C#
Aquí está la misma función escrita en C #:
Se
interpolationFactor
supone que está en el rango de0.0 ... 1.0
.Se supone que los colores están en el rango de
0 ... 255
.fuente
Necesita interpolar linealmente (LERP) los componentes de color. Así es como se hace en general, dado un valor inicial v0 , un valor final v1 y la relación requerida (un flotador normalizado entre 0.0 y 1.0):
Esto da v0 cuando la relación es 0.0, v1 cuando la relación es 1.0 y todo lo demás en los otros casos.
Puede hacer esto en los componentes RGB o utilizando algún otro esquema de color, como HSV o HLS. Los dos últimos serán más agradables visualmente, ya que trabajan en componentes de tono y brillo que se asignan mejor a nuestra percepción del color.
fuente
Diría que quiere algo entre un segmento de línea en el espacio HSV (que tiene un amarillo ligeramente brillante en el centro) y un segmento de línea en el espacio RGB (que tiene un marrón feo en el centro). Yo usaría esto, donde
power = 0
dará verde,power = 50
dará un amarillo ligeramente opaco ypower = 100
dará rojo.fuente
Aquí hay una solución de copiar y pegar para la escala Swift y HSV:
El inicializador UIColor acepta tono, saturación y brillo en [0, 1], por lo que para el valor dado de [0, 1] tenemos:
fuente
fuente
Si necesita este tipo de gradiente (en realidad invertido) en CSS (versión mínima 2.1), también puede usar HSL.
Supongamos que está en una plantilla de AngularJs y el valor es un número de 0 a 1 y desea diseñar un elemento (fondo o color de texto) ...
Primer valor: grados (0 rojo, 120 verde) Segundo valor: saturación (50% es neutral) Tercer valor: ligereza (50% neutral)
Un buen articulo aqui
Teoría en Wikipedia aquí
fuente
Aquí está la
Objective-C
versión de la solución de Simucal:Donde el nivel sería un valor entre
0.0
y1.0
.¡Espero que esto ayude a alguien!
fuente
En Python 2.7:
El porcentaje es, por supuesto
value / max_value
. O si su escala no comienza en 0 entonces(value - min_value) / (max_value - min_value)
.fuente
JavaScript
Estoy usando Google Visualization con gráfico de barras y quería que las barras fueran de verde a rojo según un porcentaje. Esta resultó ser la solución más limpia que encontré y funciona perfectamente.
Solo asegúrese de que su porcentaje sea 50 por 50% y no 0.50.
fuente
He actualizado la respuesta aceptada dividiéndola en la primera y segunda mitad del rango (0,100) y sustituyendo 100 por un nivel máximo, para que el rango pueda volverse dinámico. El resultado es exactamente como con el modelo HSV, pero sigue utilizando RGB. La clave es tener el (255,255,0) en el medio para representar el color amarillo. He combinado esta idea en la respuesta aceptada y otro código de VBA, así que consíguelo en VBA y úselo en Excel. Espero que la lógica ayude y pueda usarse en otros idiomas / aplicaciones.
Saludos, Pavlin
fuente
VB
fuente
Ejemplo autocontenido
fuente
Esto variará de rojo a amarillo y luego a verde el
valor varía de 0 a 100
fuente