Сравнение цветов

 

Привет всем! Подскажите пожалуйста, насколько приемлемо сравнивать цвета? например:

         if(ColorToString(color(ObjectGetInteger(0,name,OBJPROP_BGCOLOR)))==ColorToString(переменная color))u1++;

Это допустимая практика или лучше добавить int переменные и сравнивать их?

 
Maksim Neimerik:

Привет всем! Подскажите пожалуйста, насколько приемлемо сравнивать цвета? например:

Это допустимая практика или лучше добавить int переменные и сравнивать их?

Цвета - это по сути целочисленные значения. Их можно сравнивать напрямую. Преобразование в строку - неоправданное излишество.

 
Ihor Herasko:

Цвета - это по сути целочисленные значения. Их можно сравнивать напрямую. Преобразование в строку - неоправданное излишество.

Но это допустимо и практикуется? у меня просто много таких сравнений в коде и не все четко работают, вот я и подумал что проблема в нем, но возможно где-то иначе начудил...

 
Maksim Neimerik:

Но это допустимо и практикуется? у меня просто много таких сравнений в коде и не все четко работают, вот я и подумал что проблема в нем, но возможно где-то иначе начудил...

Настолько же, насколько допустимо сравнивать целочисленные значения.

 
Ihor Herasko:

Настолько же, насколько допустимо сравнивать целочисленные значения.

понял, спасибо!

 
Maksim Neimerik:

Но это допустимо и практикуется? у меня просто много таких сравнений в коде и не все четко работают, вот я и подумал что проблема в нем, но возможно где-то иначе начудил...

см. https://www.mql5.com/ru/docs/basis/types:

Данные типов color и datetime представляются в виде целых чисел

if(ObjectGetInteger(0,name,OBJPROP_BGCOLOR)==int(переменная color))u1++;
 
Andrey F. Zelinsky:

см. https://www.mql5.com/ru/docs/basis/types:

Данные типов color и datetime представляются в виде целых чисел

Большое спасибо, буду разбираться...

 
Maksim Neimerik:

Большое спасибо, буду разбираться...

Цвет может быть один (младшие 3 байта из 4х), а прозрачность (4й байт) разная.  Тогда сравнение не даст одинакового результата. 
Особенно, если Вы используете канвас без прозрачности (COLOR_FORMAT_XRGB_NOALPHA), то байт прозрачности не учитывается? но влияет на результат сравнения. 

В этом случае перед сравнением нужно на всякий случай обнулить черверый старший байт следующим способом: 

if (clr1&0x00FFFFFF==clr2&0x00FFFFFF) ...;
 

И еще нужно знать что в цвете RGB (без прозрачности COLOR_FORMAT_XRGB_NOALPHA) и  ARGB (с прозрачностью COLOR_FORMAT_ARGB_NORMALIZE) синий и красный цвет меняются местами

это можно продемонстрировать следующим кодом:

   color x=0x00112233;
   color y=ColorToARGB(x,0x44); 
   color z=ColorToARGB(y,0);
   uchar a=y>>24;

при отладке имеем:

т.е. если в канвасе с прозрачностью (COLOR_FORMAT_ARGB_NORMALIZE) нарисовать любой объект с цветом:

uint clr=clrRed|0xFF000000;

то цвет объекта будет синим.

 
Maksim Neimerik:

Привет всем! Подскажите пожалуйста, насколько приемлемо сравнивать цвета? например:

Это допустимая практика или лучше добавить int переменные и сравнивать их?

Если сравнивать "равно-не равно", то правильно сказали про обычное целочисленное сравнение.

Если оценивать близость одного цвета к другому, то надо брать среднее от разниц отдельных компоненов цвета R, G и B

 
Всё это не применимо к clrNONE