HSV to RGB Algorithm
As an exercise I decided to make an HSV to RGB algorithm. I came up with it while making a C program to print to the terminal in full color.
It uses a could different functions. The first is a function to clamp a double
to a double
with values ranging from 1.0 to 0.0.
double clamp_double(double n){
n = (n > 1.0) ? 1.0 : n;
n = (n < 0.0) ? 0.0 : n;
return n;
}
The second function calculates the value for a color channel based on hue.
double calc_hue(double h){
return clamp(-6 * fabs(ONE_THIRD - fmod(h, 1)) + 2);
}
The third function calculates the final color value for a channel with hue and saturation.
double calc_sv(double i, double s, double v){
return s * v * (i - 1.0) + v;
}
Finally, it's all put together:
void set_hsv_color(Color *c, double h, double s, double v){
double r, g, b;
r = calc_sv(calc_hue(h + ONE_THIRD), s, v);
g = calc_sv(calc_hue(h), s, v);
b = calc_sv(calc_hue(H - ONE_THIRD), s, v);
}
In the final fucntion the input to the function calc_hue
is offset foe each
color channel because the math in calc_hue
works out best for green but will
work just fine for red and blue if shifted.
The full code can be found here.