I sketched this code together needing a quick way to convert from RGB to HSV and back again, then realized I didn’t need it. So I’m putting it here in the theory that this may be useful someday…
/* RGBToHSV
*
* Conver to HSV
*/
static void RGBToHSV(float r, float g, float b, float *h, float *s, float *v)
{
float max = r;
if (max < g) max = g;
if (max g) min = g;
if (min > b) min = b;
/*
* Calculate h
*/
*h = 0;
if (max == min) h = 0;
else if (max == r) {
*h = 60 * (g - b)/(max - min);
if (*h = 360) *h -= 360;
} else if (max == g) {
*h = 60 * (b - r) / (max - min) + 120;
} else if (max == b) {
*h = 60 * (r - g) / (max - min) + 240;
}
if (max == 0) *s = 0;
else *s = 1 - (min / max);
*v = max;
}
/* HSVToRGB
*
* Convert to RGB
*/
static void HSVToRGB(float h, float s, float v, float *r, float *g, float *b)
{
if (h 359) h = 359;
if (s 1) s = 100;
if (v 1) v = 100;
float tmp = h/60.0;
int hi = floor(tmp);
float f = tmp - hi;
float p = v * (1 - s);
float q = v * (1 - f * s);
float t = v * (1 - (1 - f) * s);
switch (hi) {
case 0:
*r = v;
*g = t;
*b = p;
break;
case 1:
*r = q;
*g = v;
*b = p;
break;
case 2:
*r = p;
*g = v;
*b = t;
break;
case 3:
*r = p;
*g = q;
*b = v;
break;
case 4:
*r = t;
*g = p;
*b = v;
break;
case 5:
*r = v;
*g = p;
*b = q;
break;
}
}