//Precise HSL-to-RGB conversion
//Greg Toombs
//Last edited March 26, 2001
#include
#include
/*
unsigned hue(unsigned h) {
unsigned r, g, b;
r = min(256, max(0, abs(3*256 - h % (6*256))) - 256);
g = min(256, max(0, abs(3*256 - (h + 4*256) % (6*256))) - 256);
b = min(256, max(0, abs(3*256 - (h + 2*256) % (6*256))) - 256);
return r | (g << 8) | (b << 16);
}
*/
#define min(a,b) (((a)<(b))?(a):(b))
#define max(a,b) (((a)>(b))?(a):(b))
#define bmax 100.0 //Input HSL channel maximum
#define cmax 255.0 //Output color maximum
void HslToRgb(double h, double s, double L, double& r, double& g, double& b) {
h *= cmax*6.0/bmax;
s *= cmax/bmax;
L *= cmax/bmax;
r = min(cmax, max(0.0, fabs(3.0*cmax - fmod(h, 6.0*cmax)) - cmax));
g = min(cmax, max(0.0, fabs(3.0*cmax - fmod(h + 4.0*cmax, 6.0*cmax)) - cmax));
b = min(cmax, max(0.0, fabs(3.0*cmax - fmod(h + 2.0*cmax, 6.0*cmax)) - cmax));
if (L > cmax/2) {
r = (L*2/cmax-1)*(cmax-r) + r;
g = (L*2/cmax-1)*(cmax-g) + g;
b = (L*2/cmax-1)*(cmax-b) + b;
}
else {
r *= L*2/cmax;
g *= L*2/cmax;
b *= L*2/cmax;
}
double ave = (r + g + b)/3.0;
r = (1.0-s/cmax)*(ave - r) + r;
g = (1.0-s/cmax)*(ave - g) + g;
b = (1.0-s/cmax)*(ave - b) + b;
}
void main() {
double h, s, l, r, g, b;
cout << "Enter a hue, a saturation, and a luminance channel, all from 0-100.\n";
cin >> h >> s >> l;
HslToRgb(h, s, l, r, g, b);
cout << "The equivalent RGB color is " << r << ',' << g << ',' << b << '\n';
}