I'm writing a Java game and I want to implement a power meter for how hard you are going to shoot something.
I need to write a function that takes a int between 0 - 100, and based on how high that number is, it will return a color between Green (0 on the power scale) and Red (100 on the power scale).
Similar to how volume controls work:
What operation do I need to do on the Red, Green, and Blue components of a color to generate the colors between Green and Red?
So, I could run say, getColor(80)
and it will return an orangish color (its values in R, G, B) or getColor(10)
which will return a more Green/Yellow RGB value.
I know I need to increase components of the R, G, B values for a new color, but I don't know specifically what goes up or down as the colors shift from Green-Red.
Progress:
I ended up using HSV/HSB color space because I liked the gradiant better (no dark browns in the middle).
The function I used was:
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);
}
Where "power" is a number between 0.0 and 1.0. 0.0 will return a bright red, 1.0 will return a bright green.
Java Hue Chart:
Off the top of my head, here is the green-red hue transition in HSV space, translated to RGB:
The red, green, blue values in the above example are percentages, you'd probably want to multiply them by 255 to get the most used 0-255 range.
In Python 2.7:
Percent is of course
value / max_value
. Or if your scale doesn't begin at 0 then(value - min_value) / (max_value - min_value)
.Here is copy-and-paste solution for Swift and HSV scale:
UIColor initializer accepts hue, saturation and brightness in [0, 1] so for given value from [0, 1] we have:
Self contained example
JavaScript
I am using Google Visualization with bar chart and wanted the bars to be green to red based on a percentage. This turned out to be the cleanest solution I found and works perfectly.
Just make sure your percentage is 50 for 50% and not 0.50.
This should work - just linearly scale the red and green values. Assuming your max red/green/blue value is
255
, andn
is in range0 .. 100
(Amended for integer maths, tip of the hat to Ferrucio)
Another way to do would be to use a HSV colour model, and cycle the hue from
0 degrees
(red) to120 degrees
(green) with whatever saturation and value suited you. This should give a more pleasing gradient.Here's a demonstration of each technique - top gradient uses RGB, bottom uses HSV: