Сделать цвет объекта более блёклым - руками vs код.

 

Требуется после создания объекта (прямоугольника) сделать его более блёклым, чтобы и глаза не мозолил и виден был на графике. Делаю это через вызов функций RGBtoHSL, l выставляю в 200, и обратно HSLtoRGB, далее назначаю цвет объекту. Но результат получается отличным от того, что если те же действия сделать руками через диалог свойств объекта. Внизу приведена картинка, где в верхней части параметр "яркость"  в реальности Luminate задан руками в 200, в нижней части картинки параметр задаётся в алгоритме. Код функций приведён еще ниже. Существующее положение дел можно считать приемлемым,но всё же хочется получить идентичный результат в обоих случаях.





//+------------------------------------------------------------------+
//| Fast RGB to HSL for single pixel (0-255)                        |
//+------------------------------------------------------------------+
void RGBtoHSL(uchar r, uchar g, uchar b, uchar &h, uchar &s, uchar &l)
{
    double r_norm = r / 255.0;
    double g_norm = g / 255.0;
    double b_norm = b / 255.0;
    
    double max = MathMax(r_norm, MathMax(g_norm, b_norm));
    double min = MathMin(r_norm, MathMin(g_norm, b_norm));
    double delta = max - min;
    
    // Lightness
    double lightness = (max + min) / 2.0;
    l = (uchar)(lightness * 255);
    
    // Saturation
    double saturation = 0;
    if(delta > 0.00001)
        saturation = delta / (1 - MathAbs(2 * lightness - 1));
    s = (uchar)(saturation * 255);
    
    // Hue
    double hue = 0;
    if(delta > 0.00001)
    {
        if(max == r_norm)
            hue = 60.0 * fmod((g_norm - b_norm) / delta, 6.0);
        else if(max == g_norm)
            hue = 60.0 * (((b_norm - r_norm) / delta) + 2.0);
        else if(max == b_norm)
            hue = 60.0 * (((r_norm - g_norm) / delta) + 4.0);
            
        if(hue < 0)
            hue += 360.0;
    }
    h = (uchar)(hue / 360.0 * 255);
}

//+------------------------------------------------------------------+
//| Fast HSL to RGB for single pixel (0-255)                        |
//+------------------------------------------------------------------+
void HSLtoRGB(uchar h, uchar s, uchar l, uchar &r, uchar &g, uchar &b)
{
    double hue = (double)h / 255.0 * 360.0;
    double saturation = (double)s / 255.0;
    double lightness = (double)l / 255.0;
    
    if(saturation <= 0.00001)
    {
        r = l;
        g = l;
        b = l;
        return;
    }
    
    double chroma = (1 - MathAbs(2 * lightness - 1)) * saturation;
    double hue_sector = hue / 60.0;
    double x = chroma * (1 - MathAbs(fmod(hue_sector, 2) - 1));
    
    double r1, g1, b1;
    
    if(hue_sector < 1) { r1 = chroma; g1 = x; b1 = 0; }
    else if(hue_sector < 2) { r1 = x; g1 = chroma; b1 = 0; }
    else if(hue_sector < 3) { r1 = 0; g1 = chroma; b1 = x; }
    else if(hue_sector < 4) { r1 = 0; g1 = x; b1 = chroma; }
    else if(hue_sector < 5) { r1 = x; g1 = 0; b1 = chroma; }
    else { r1 = chroma; g1 = 0; b1 = x; }
    
    double m = lightness - chroma / 2;
    r = (uchar)MathRound((r1 + m) * 255);
    g = (uchar)MathRound((g1 + m) * 255);
    b = (uchar)MathRound((b1 + m) * 255);
}


// Функция уменьшения яркости через YUV
color DimColor(const color clr, const double factor) {
    // Извлечение компонентов ARGB
    uchar a = (clr >> 24) & 0xFF;
    uchar r = (clr >> 16) & 0xFF;
    uchar g = (clr >> 8)  & 0xFF;
    uchar b = clr & 0xFF;

    // Преобразование в YUV
    uchar y, u, v;
    //RGBtoYUV(r, g, b, y, u, v);
    RGBtoHSL(r, g, b, y, u, v);

    // Уменьшение яркости
    v = 200;
    // Обратное преобразование в RGB
    uchar new_r, new_g, new_b;
    HSLtoRGB(y, u, v, new_r, new_g, new_b);

    // Сборка нового цвета
    return (a << 24) | (new_r << 16) | (new_g << 8) | new_b;
}
      
 

Пожалуйста, также включите код вызова этих функций.

Если вы предоставите полный код, который компилируется и воспроизводит вашу проблему, я проверю.

 
Alain Verleyen #:

Пожалуйста, также включите код вызова этих функций.

Если вы предоставите полный код, который компилируется и воспроизводит вашу проблему, я проверю.

Пожалуйста.
Файлы:
Test_HSL.mq5  11 kb
 
Nikolay Kuznetsov #:
Пожалуйста.
Попробуйте ColorMix.mqh из алгокниги (часть 5).
MQL5 Programming for Traders – Source Codes from the Book. Part 5
MQL5 Programming for Traders – Source Codes from the Book. Part 5
  • 2023.12.15
  • www.mql5.com
In Part 5 of the book, we'll delve deeper into the APIs associated with algorithmic trading, including financial data analysis and processing, chart visualization, automation, and user interactions.
 
Nikolay Kuznetsov # :
Пожалуйста.

Исправлено, были некоторые ошибки.

Файлы:
 
Alain Verleyen #:

Исправлено, были некоторые ошибки.

Отлично! Вы молодец!