У меня есть класс HueSaturation
, который фиксирует оттенок и насыщенность и допускает переменную яркость.
Я реализовал преобразование HSL в RGB из Википедии, но результаты не совсем согласуются с эталонными значениямииз других источников.
Все параметры h, s и l находятся в диапазоне [0..1].
HueSaturation::RGB
HueSaturation::rgb (double lum)
const
{
if (false == (0 <= lum && lum <= 1))
throw std::invalid_argument (__PRETTY_FUNCTION__);
const double C = (1 - abs (2 * lum - 1)) * m_sat;
const double H = m_hue * 6; // NOTE: 0 <= m_hue <= 1, not [0..360]
const double X = C * (1 - abs (fmod (H, 2) - 1));
double R1 = 0;
double G1 = 0;
double B1 = 0;
switch (int (H))
{
case 6:
// Overlap.
if (1 == m_hue)
[[fallthrough]];
else
throw std::logic_error (__PRETTY_FUNCTION__);
case 0:
R1 = C;
G1 = X;
break;
case 1:
R1 = X;
G1 = C;
break;
case 2:
G1 = C;
B1 = X;
break;
case 3:
G1 = X;
B1 = C;
break;
case 4:
R1 = X;
B1 = C;
break;
case 5:
R1 = C;
B1 = X;
break;
default:
throw std::logic_error (__PRETTY_FUNCTION__);
};
const double m = lum - C / 2;
return {R1 + m, G1 + m, B1 + m};
}
Например, HSL[0.8,0.2,0.4]
(или [208,20,40]
inединицы градуса / процента) отображаются на RGB[114,81,122]
, тогда как другие программы сообщают мне, что это должно быть RGB[82,103,122]
.Закрыть, но не совсем.
Где моя ошибка?