Что не так с этим преобразованием HSL -> RGB? - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть класс 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].Закрыть, но не совсем.

Где моя ошибка?

...