#include <iostream>
#include <cmath>
#define MIN3(A, B, C) std::min(A, std::min(B, C))
typedef double value_type;
using std::cout;
using std::endl;
using std::sqrt;
struct RGB
{
value_type R, G, B;
};
struct HSI
{
value_type H, S, I;
};
void convertRGBtoHSI(RGB input, HSI &output)
{
RGB &color = input;
value_type &hue = output.H;
value_type &saturation = output.S;
value_type &intensity = output.I;
intensity = (color.R + color.G + color.B) / 3;
if((color.R + color.G + color.B) == 765)
{
saturation = 0;
hue = 0;
}
MIN3(color.R, color.G, color.B);
if(intensity > 0)
{
value_type did = MIN3(color.R, color.G, color.B)/ intensity;
saturation = 1 - did;
}
else if (intensity == 0)
{
saturation = 0;
}
value_type color123 = (color.R * color.R) + (color.G * color.G) +
(color.B * color.B) - (color.R * color.G) -
(color.R * color.B) - (color.G * color.B);
double sqrt2 = (double)sqrt((double)color123);
value_type temp = (color.R - (color.G/2) - (color.B/2)) / ( sqrt2 );
if (color.G >= color.B)
{
hue = acos(temp);
}
else if (color.B > color.G)
{
hue = 360 - acos(temp);
}
}
int main()
{
RGB a = {255, 255, 255};
HSI b;
convertRGBtoHSI(a, b);
cout << "Input : " << a.R << ", " << a.G << ", " << a.B << endl;
cout << "Output : " << b.H << ", " << b.S << ", " << b.I << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CgojZGVmaW5lIE1JTjMoQSwgQiwgQykgc3RkOjptaW4oQSwgc3RkOjptaW4oQiwgQykpCgp0eXBlZGVmIGRvdWJsZSB2YWx1ZV90eXBlOwoKdXNpbmcgc3RkOjpjb3V0Owp1c2luZyBzdGQ6OmVuZGw7CnVzaW5nIHN0ZDo6c3FydDsKCnN0cnVjdCBSR0IKewogICAgdmFsdWVfdHlwZSBSLCBHLCBCOwp9OwoKc3RydWN0IEhTSQp7CiAgICB2YWx1ZV90eXBlIEgsIFMsIEk7Cn07Cgp2b2lkIGNvbnZlcnRSR0J0b0hTSShSR0IgaW5wdXQsIEhTSSAmb3V0cHV0KQp7CiAgICBSR0IgJmNvbG9yID0gaW5wdXQ7CiAgICB2YWx1ZV90eXBlICZodWUgPSBvdXRwdXQuSDsKICAgIHZhbHVlX3R5cGUgJnNhdHVyYXRpb24gPSBvdXRwdXQuUzsKICAgIHZhbHVlX3R5cGUgJmludGVuc2l0eSA9IG91dHB1dC5JOwoKICAgIGludGVuc2l0eSA9IChjb2xvci5SICsgY29sb3IuRyArIGNvbG9yLkIpIC8gMzsKCiAgICBpZigoY29sb3IuUiArIGNvbG9yLkcgKyBjb2xvci5CKSA9PSA3NjUpCiAgICB7CiAgICAgICAgc2F0dXJhdGlvbiA9IDA7CiAgICAgICAgaHVlID0gMDsKICAgIH0KCiAgICBNSU4zKGNvbG9yLlIsIGNvbG9yLkcsIGNvbG9yLkIpOwogICAgaWYoaW50ZW5zaXR5ID4gMCkKICAgIHsKICAgICAgICB2YWx1ZV90eXBlIGRpZCA9IE1JTjMoY29sb3IuUiwgY29sb3IuRywgY29sb3IuQikvIGludGVuc2l0eTsKICAgICAgICBzYXR1cmF0aW9uID0gMSAtIGRpZDsKICAgIH0KICAgIGVsc2UgaWYgKGludGVuc2l0eSA9PSAwKQogICAgewogICAgICAgIHNhdHVyYXRpb24gPSAwOwogICAgfQogICAgdmFsdWVfdHlwZSBjb2xvcjEyMyA9IChjb2xvci5SICogY29sb3IuUikgKyAoY29sb3IuRyAqIGNvbG9yLkcpICsKICAgICAgICAgICAgKGNvbG9yLkIgKiBjb2xvci5CKSAtIChjb2xvci5SICogY29sb3IuRykgLQogICAgICAgICAgICAoY29sb3IuUiAqIGNvbG9yLkIpIC0gKGNvbG9yLkcgKiBjb2xvci5CKTsKICAgIGRvdWJsZSBzcXJ0MiA9IChkb3VibGUpc3FydCgoZG91YmxlKWNvbG9yMTIzKTsKICAgIHZhbHVlX3R5cGUgdGVtcCA9IChjb2xvci5SIC0gKGNvbG9yLkcvMikgLSAoY29sb3IuQi8yKSkgLyAoIHNxcnQyICk7CiAgICBpZiAoY29sb3IuRyA+PSBjb2xvci5CKQogICAgewogICAgICAgIGh1ZSA9IGFjb3ModGVtcCk7CiAgICB9CiAgICBlbHNlIGlmIChjb2xvci5CID4gY29sb3IuRykKICAgIHsKICAgICAgICBodWUgPSAzNjAgLSBhY29zKHRlbXApOwogICAgfQp9CgoKaW50IG1haW4oKQp7CiAgICBSR0IgYSA9IHsyNTUsIDI1NSwgMjU1fTsKICAgIEhTSSBiOwogICAgY29udmVydFJHQnRvSFNJKGEsIGIpOwogICAgCiAgICBjb3V0IDw8ICJJbnB1dCAgOiAiIDw8IGEuUiA8PCAiLCAiIDw8IGEuRyA8PCAiLCAiIDw8IGEuQiA8PCBlbmRsOwogICAgY291dCA8PCAiT3V0cHV0IDogIiA8PCBiLkggPDwgIiwgIiA8PCBiLlMgPDwgIiwgIiA8PCBiLkkgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==