Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Igors от Январь 26, 2013, 10:52



Название: Сложить 2 QColor
Отправлено: Igors от Январь 26, 2013, 10:52
Добрый день

Есть 2 QColor, как получить их сумму? (метода/оператора не видно)

Спасибо


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 26, 2013, 11:58
Слишком не однозначное значение у "суммы цветов". Складывать компоненты RGB или CMYK?  Что делать при переполнении?
Поэтому, IMHO, "сумму цветов" оставили на совести конечных пользователей, так сказать как они это представляют.


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 26, 2013, 12:08
Слишком не однозначное значение у "суммы цветов". Складывать компоненты RGB или CMYK?  Что делать при переполнении?
Поэтому, IMHO, "сумму цветов" оставили на совести конечных пользователей, так сказать как они это представляют.
Складывать ARGB. При переполнении обрезать (клиппить). Словом: ARGB модель


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 26, 2013, 12:10
Складывать RGB. При переполнении обрезать (клиппить). Словом: RGB модель
Писать свои операторы.


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 26, 2013, 12:12
Писать свои операторы.
Прошу исполнить  :)


Название: Re: Сложить 2 QColor
Отправлено: m_ax от Январь 26, 2013, 12:14
Помню, эта тема уже как то обсуждалась на этом форуме.. Страниц на десяток с обсуждением (эмоциональным и рукомахательным) и вроде даже в конце пришли к чему то))  


Название: Re: Сложить 2 QColor
Отправлено: m_ax от Январь 26, 2013, 12:17
Помню, эта тема уже как то обсуждалась на этом форуме.. Страниц на десяток с обсуждением (эмоциональным и рукомахательным) и вроде даже в конце пришли к чему то))  

А, не.. там три цвета нужно было сложить.. + ещё альфа канал учесть))
Так что, Old, советую сразу решать в общем виде с N цветами))


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 26, 2013, 12:21
Прошу исполнить  :)
Код
C++ (Qt)
QColor operator+( const QColor &a, const &b )
{
   return QColor( qBound( 0, a.red() + b.red(), 255 ), qBound( 0, a.green() + b.green(), 255 ), qBound( 0, a.blue() + b.blue(), 255 ) );
}
 

Что делать с альфой пока не знаю, если вы мне скажете какая она должна быть для "вашей суммы цветов", то я ее обязательно учту. :)


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 26, 2013, 12:26
Что делать с альфой пока не знаю, если вы мне скажете какая она должна быть для "вашей суммы цветов", то я ее обязательно учту. :)
Альфа выходного цвета должна быть равна сумме альф слагаемых.

Помню, эта тема уже как то обсуждалась на этом форуме.. Страниц на десяток с обсуждением (эмоциональным и рукомахательным) и вроде даже в конце пришли к чему то)) 
Ну так наверное Вы и решение помните - вот и приведите  :)



Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 26, 2013, 12:29
Альфа выходного цвета должна быть равна сумме альф слагаемых.
Код
C++ (Qt)
QColor operator+( const QColor &a, const &b )
{
   return QColor( qBound( 0, a.red() + b.red(), 255 ), qBound( 0, a.green() + b.green(), 255 ), qBound( 0, a.blue() + b.blue(), 255 ), qBound( 0, a.alpha() + b.alpha(), 255 ) );
}
 


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 26, 2013, 12:34
Код
C++ (Qt)
QColor operator+( const QColor &a, const &b )
{
   return QColor( qBound( 0, a.red() + b.red(), 255 ), qBound( 0, a.green() + b.green(), 255 ), qBound( 0, a.blue() + b.blue(), 255 ), qBound( 0, a.alpha() + b.alpha(), 255 ) );
}
 
Вот оказывается как все просто! А сомнений у Вас никаких не возникает?  :)


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 26, 2013, 12:36
Вот оказывается как все просто! А сомнений у Вас никаких не возникает?  :)
У меня вообще возникает сомнение в целесообразности "складывания цветов". :)


Название: Re: Сложить 2 QColor
Отправлено: Bepec от Январь 26, 2013, 12:41
Как обычно нет условий, по которым будут складываться цвета :)

Видимо на это Igors  и намекает в очередной раз :D

PS а так да - простейшее сложении в простой форме.


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 26, 2013, 12:46
У меня вообще возникает сомнение в целесообразности "складывания цветов". :)
Отчего же? Это банальная операция напр в популярном Photoshop'e

Как обычно нет условий, по которым будут складываться цвета :)

Видимо на это Igors  и намекает в очередной раз :D

PS а так да - простейшее сложении в простой форме.
Я намекаю что если проверить предложенный оператор на 2 цветах - получите чепуху


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 26, 2013, 12:49
Я намекаю что если проверить предложенный оператор на 2 цветах - получите чепуху
Дайте формула абсолютного топлива для расчета суммы цветов, будем проверять. :)


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 26, 2013, 12:59
Дайте формула абсолютного топлива для расчета суммы цветов, будем проверять. :)
Ну интересно, а мне кто ее даст? :)  А проверить можем

a = (255, 0, 0, 0)  // ARGB. черный, альфа 255
b = (0, 255, 255, 255)  // белый, альфа 0

У второго цвета альфа = 0 значит черный, был, черный, и остался. А у Вас чего-то белый....

Edit: виноват, напутал в цифирках, подправил


Название: Re: Сложить 2 QColor
Отправлено: m_ax от Январь 26, 2013, 13:03
Помню, эта тема уже как то обсуждалась на этом форуме.. Страниц на десяток с обсуждением (эмоциональным и рукомахательным) и вроде даже в конце пришли к чему то)) 
Ну так наверное Вы и решение помните - вот и приведите  :)

Не, не.. я лучше понаблюдаю) А то я тут уже и за винцом подумываю сходить)


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 26, 2013, 13:11
Ну интересно, а мне кто ее даст? :)  А проверить можем
Что проверить? Давайте математику.
А если у вас ее нет, то почему вы решили, что она есть у разработчиков Qt или вообще есть?
Как это делает фотошоп, нужно спрашивать у его разработчиков. Как это сделано в gimp можно посмотреть в его исходниках, но я сильно сомневаюсь что это одинаковые алгоритмы.


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 26, 2013, 13:12
Не, не.. я лучше понаблюдаю)
Я тоже. :)


Название: Re: Сложить 2 QColor
Отправлено: m_ax от Январь 26, 2013, 13:17
Помню, эта тема уже как то обсуждалась на этом форуме.. Страниц на десяток с обсуждением (эмоциональным и рукомахательным) и вроде даже в конце пришли к чему то)) 
Ну так наверное Вы и решение помните - вот и приведите  :)

Не, не.. я лучше понаблюдаю) А то я тут уже и за винцом подумываю сходить)

Пошёл искать ту тему и не нашёл чёта((
Зато нашёл аналогичную: http://www.prog.org.ru/topic_18922_0.html (http://www.prog.org.ru/topic_18922_0.html)
Но, та, конечно, была интересней)) Перечитал бы ещё раз с удовольствием)


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 26, 2013, 13:20
Не, не.. я лучше понаблюдаю) А то я тут уже и за винцом подумываю сходить)
Да как же так? Только что Вы уверенно заявляли что занимаетесь инженерными расчетами, а тут сразу в кусты да за винцом  :)

Что проверить? Давайте математику.
А если у вас ее нет, то почему вы решили, что она есть у разработчиков Qt или вообще есть?
Как это делает фотошоп, нужно спрашивать у его разработчиков. Как это сделано в gimp можно посмотреть в его исходниках, но я сильно сомневаюсь что это одинаковые алгоритмы.
Ладно, не Ваша предметная область, даю. Для каждой RGB компоненты

sum_color = (color_1 * alpha_1 + color_2 * alpha_2) / (alpha_1 + alpha_2);

А оператор за Вами


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 26, 2013, 13:21
Но, та, конечно, была интересней)) Перечитал бы ещё раз с удовольствием)
Лови: http://www.prog.org.ru/topic_14700_0.html :)


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 26, 2013, 13:22
А оператор за Вами
Итоговая альфа?
Для этой формулы есть ограничения: два цвета не могут одновременно иметь alpha = 0. :)


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 26, 2013, 13:32
Итоговая альфа?
Для этой формулы есть ограничения: два цвета не могут одновременно иметь alpha = 0. :)
Итоговая альфа = просто сумме (это уже говорилось выше). Да, если обе альфы 0, то выходной RGB цвет не определен. Однако поскольку выходная альфа тоже 0, то для юзверя все норм. Такие коллизии надо решать самостоятельно, здесь уже предметная часть здесь ни при чем.


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 26, 2013, 13:36
Такие коллизии надо решать самостоятельно, здесь уже предметная часть здесь ни при чем.
Не в вашем случае... Здесь лучше переспросить. ;)


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 26, 2013, 13:58
Код
C++ (Qt)
static inline qreal c_to_f( int v ) { return qreal( v ) / 255.; }
 
QColor operator+( const QColor &c1, const QColor &c2 )
{
   if( !c1.alpha() && !c2.alpha() )
     return QColor( 0, 0, 0, 0 );
 
   qreal a1 = c_to_f( c1.alpha() );
   qreal a2 = c_to_f( c2.alpha() );
   qreal a = qBound( 0., a1 + a2, 1. );
 
   qreal r = qBound( 0., ( ( c_to_f( c1.red() ) * a1 + c_to_f( c2.red() ) * a2 ) / a, 1. );
   qreal g = qBound( 0., ( ( c_to_f( c1.green() ) * a1 + c_to_f( c2.green() ) * a2 ) / a, 1. );
   qreal b = qBound( 0., ( ( c_to_f( c1.blue() ) * a1 + c_to_f( c2.blue() ) * a2 ) / a, 1. );;
 
   return QColor::fromRgbF( r, g, b, a );
}
 

Писал прямо здесь, могут быть опечатки.

От c_to_f можно отказаться, значения компонентов для вещественных чисел уже возвращаются приведенные к отрезку 0...1.
Код
C++ (Qt)
QColor operator+( const QColor &c1, const QColor &c2 )
{
   if( !c1.alpha() && !c2.alpha() )
     return QColor( 0, 0, 0, 0 );
 
   qreal a1 = c1.alphaF();
   qreal a2 = c2.alphaF();
   qreal a = qBound( 0., a1 + a2, 1. );
 
   qreal r = qBound( 0., ( c1.redF() * a1 + c2.redF() * a2 ) / a, 1. );
   qreal g = qBound( 0., ( c1.greenF() * a1 + c2.greenF() * a2 ) / a, 1. );
   qreal b = qBound( 0., ( c1.blueF() * a1 + c2.blueF() * a2 ) / a, 1. );
 
   return QColor::fromRgbF( r, g, b, a );
}
 


Название: Re: Сложить 2 QColor
Отправлено: m_ax от Январь 26, 2013, 14:08
Не, не.. я лучше понаблюдаю) А то я тут уже и за винцом подумываю сходить)
Да как же так? Только что Вы уверенно заявляли что занимаетесь инженерными расчетами, а тут сразу в кусты да за винцом  :)

Так я уже говорил об этом..
Код
C++ (Qt)
const QColor operator+(const QColor &c1, const QColor &c2) {
 
   qreal x = 0.5 * (1.0 - c1.alphaF() + c2.alphaF());
 
   qreal alpha  = 0.5 * (c1.alphaF() + c2.alphaF());
   qreal red     = c1.redF() * (1.0 - x) + x * c2.redF();
   greal green  = c1.greenF() * (1.0 - x) + x * c2.greenF();
   qreal blue    = c1.blueF() * (1.0 - x) + x * c2.blueF();
 
   return QColor(red, green, blue, alpha);
}
 

Но, та, конечно, была интересней)) Перечитал бы ещё раз с удовольствием)
Лови: http://www.prog.org.ru/topic_14700_0.html :)
Да, были времена  8)

 


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 26, 2013, 14:42
Писал прямо здесь, могут быть опечатки.
Опечатки переживем, по сути

- (cosmetic) Вместо qBound лучше смотрится qMin

- (bug) Вы подрезаете альфу ДО деления на нее, а надо после. Напр я складываю белый + черный. Если обе альфы = 255, должен получиться серый

- (performance) пусть один QColor или оба хранятся напр в HSV. Тогда обращение к каждой компоненте вызывает конверсию HSV->RGB, что весьма недешево.

Исправьте пожалуйста, пипл любит текст для copy/paste

Так я уже говорил об этом..
Код
C++ (Qt)
const QColor operator+(const QColor &c1, const QColor &c2) {
 
   qreal x = 0.5 * (1.0 - c1.alphaF() + c2.alphaF());
 
Так что, выходит от перестановки слагаемых сумма меняется? (ведь альфы у Вас неравноправны).


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 26, 2013, 14:48
- (cosmetic) Вместо qBound лучше смотрится qMin
qBound это по сути qMax и qMin.

- (bug) Вы подрезаете альфу ДО деления на нее, а надо после. Напр я складываю белый + черный. Если обе альфы = 255, должен получиться серый
Это спорно. :) Возможно это баг именно в вашей модели.

- (performance) пусть один QColor или оба хранятся напр в HSV. Тогда обращение к каждой компоненте вызывает конверсию HSV->RGB, что весьма недешево.
Мы говорим только о:
Цитировать
Складывать ARGB. При переполнении обрезать (клиппить). Словом: ARGB модель

Исправьте пожалуйста, пипл любит текст для copy/paste
Так велком. :)



Название: Re: Сложить 2 QColor
Отправлено: m_ax от Январь 26, 2013, 14:49

Так я уже говорил об этом..
Код
C++ (Qt)
const QColor operator+(const QColor &c1, const QColor &c2) {
 
   qreal x = 0.5 * (1.0 - c1.alphaF() + c2.alphaF());
 
Так что, выходит от перестановки слагаемых сумма меняется? (ведь альфы у Вас неравноправны).


Нет, результат не меняется от перестановки слагаемых. Альфа равноправны. См. код ниже..

пояснение:
при перестановки c1 и с2, x переходит в 1-x, а 1-x в x.
Поэтому всё корректно)

 


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 26, 2013, 16:04
2m_ax Пусть напр с1.alpha != 0, с2.alpha == 0. Тогда результат должен быть равен с1 (полностью прозрачное изображение ничего не меняет). А у Вас x != 0, значит с2.red (green, blue) что-то вносят в результат. А альфу Вы чего-то вообще осреднили, это не есть аддитивный эффект/сложение.

- (bug) Вы подрезаете альфу ДО деления на нее, а надо после. Напр я складываю белый + черный. Если обе альфы = 255, должен получиться серый
Это спорно. :) Возможно это баг именно в вашей модели.
Не спорно, а я ошибся. Белый + черный = белый, ведь мы хотим сумму. У Вас правильно, беру свои слова взад  :)

Теперь немного о другом. Не кажется ли Вам, что что-то идет не так? Вроде и формулка простейшая, а реализация чего-то развесистая, да еще и скрытая подлянка с производительностью. Если рассматривать более сложные операции (где участвуют 3-4 цвета), то это станет невыносимо. В чем причина?


Название: Re: Сложить 2 QColor
Отправлено: Bepec от Январь 26, 2013, 19:54
Причина в том же, в чем причина работы с музыкой - специфика. И без опыта и использования выверенных формул и алгоритмов нужно доходить до желанного результата самому очень долго :)



Название: Re: Сложить 2 QColor
Отправлено: m_ax от Январь 26, 2013, 20:30
Теперь немного о другом. Не кажется ли Вам, что что-то идет не так? Вроде и формулка простейшая, а реализация чего-то развесистая, да еще и скрытая подлянка с производительностью. Если рассматривать более сложные операции (где участвуют 3-4 цвета), то это станет невыносимо. В чем причина?

Да причина проста, об этом уже тож много говорили.. Конечный результат (вернее его качество) будет напрямую зависеть от постановки задачи.. Если задача плохо поставлена, или вообще не поставлена (корректно) то львиная часть времени будет просто в пустую утекать на её доопределения и выяснения что же всё-таки хотел постановщик этой задачи) Что, кстатии, весьма часто и происходит... за примерами далеко ходить не надо)

Это во-первых..
А во-вторых есть ещё такой момент который, пожалуй, является следствием первого: решения, направленные (и сформулированные) на написание костылей, дабы залатать дыры изначально нелепой архитектуры, как правило, и вызывают ту невыносимость и отторжение)  


Есть такая шутка у теоретиков: если вы не можете объяснить вашу теорию доступно своей жене, то это теория скорее всего неправильная)



Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 27, 2013, 12:25
Конечный результат (вернее его качество) будет напрямую зависеть от постановки задачи..
Помилуйте, какая "задача/постановка"? Вам что, неизвестно что такое альфа-канал?

visible_red = color.red * color.alpha    // premultiply - видимый красный цвет
result.red = visible_red / result.alpha;  // un-premultiply - обратная операция, видимый в Red с учетом альфы

Вот и все :)  Но я хотел поговорить не об этом. Чисто с точки зрения техники программирования - удачна ли реализация оператора + для класса QColor? Да, она корректна в том смысле что дает нужный результат, но хорошее ли это "архитектурное" решение? Мне кажется что нет, а Вы как думаете?


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 27, 2013, 12:38
Чисто с точки зрения техники программирования - удачна ли реализация оператора + для класса QColor? Да, она корректна в том смысле что дает нужный результат, но хорошее ли это "архитектурное" решение? Мне кажется что нет, а Вы как думаете?
Еще раз, мы что обсуждаем "технику" или "архитектуру"?

Это как спросить: А как вам, с точки зрения архитектуры, шипы на балконных ограждениях? Издали смотрятся  очень эффектно, а вот перелазить - больно. :)


Название: Re: Сложить 2 QColor
Отправлено: Bepec от Январь 27, 2013, 12:45
Уже традиция Igors - задача без поставленной цели.

Сделайте мне ээ.. машину...

Сделали. А почему она трехколёсная, надо ж было на антигравитационной тяге.

Сделали. А почему у неё нет багажника на 15 тонн?

Сделали. А почему она не вписывается в дизайн и стилистику 90-х годов?

Сделали. А почему в ней используются новые НА-НА-технологии?

Сделали на дровах. Она же убивает окружающую среду - деревья рубим и дымим - а не пошёл бы ты, заказчик в баню :D

PS После этого тема хиреет и умирает :D


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 27, 2013, 13:01
Еще раз, мы что обсуждаем "технику" или "архитектуру"?
Обсуждаем насколько хорош (или плох) оператор + для QColor. К чему это отнести - технике или архитектуре - на Ваш вкус.

Сделайте мне ээ.. машину...
Сделали. А почему она трехколёсная, надо ж было ..
...
Так ведь именно так все и происходит в реальной задаче :)


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 27, 2013, 13:06
Обсуждаем насколько хорош (или плох) оператор + для QColor. К чему это отнести - технике или архитектуре - на Ваш вкус.
Хорошо, намекну по другому. Скажите, а метод push_back в std::vector он плох или хорошо?


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 27, 2013, 13:30
Хорошо, намекну по другому. Скажите, а метод push_back в std::vector он плох или хорошо?
"Мне сказали сложить 2 QColor по такой-то формуле - я сделал. (какие претензии?)". Конечно никаких, но помнится Вы можете быть куда более активны в плане постановки, напр
Да, но таково условие задачи
Это условие вытекает из плохого знания предмета топикстартером. В такой многозадачности просто нет смысла. :)
Поэтому я и ожидал Вашей уничтожающей критики  :)


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 27, 2013, 13:38
"Мне сказали сложить 2 QColor по такой-то формуле - я сделал. (какие претензии?)".
Намек понят не был, ну да ладно... :)

Все зависит от контекста его использования (оператора+): для эпизодического сложения двух цветов - он хорош, для складывания массива цветов на время - плох.
Как, в прочем, и все в программирование. :)


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 28, 2013, 13:07
Все зависит от контекста его использования (оператора+): для эпизодического сложения двух цветов - он хорош, для складывания массива цветов на время - плох.
Как, в прочем, и все в программирование. :)
Такая "диалектика" вполне уместна, но что-то уж очень "вообще" :)  QColor - прекрасный класс для перегонки из одной модели в другую, но для арифметики цветов он совершенно непригоден. Углубимся в детали
Код
C++ (Qt)
qreal QColor::red( void ) const;
 
Все строго по книжке - полная инкапсуляция, пользователь не знает (и не должен знать) откуда берется red. Но всегда ли это "так уж хорошо"? Вовсе нет. Довольно редко нужна именно красная компонента, подавляющее большинство операций применяются однообразно ко всем 3 цветам. И аксессоры путаются под ногами, раздувая текст "зато" делая его менее понятным. Вторая проблема еще более неприятна. Сделав red виртуальным (по сути) мы теперь должны "хавать что дают" и не можем дать никаких гарантий производительности.

Если исходные данные хранятся в QColor, то лучшее что мы можем сделать - это вылить его в какую-то промежуточную структуру (на худой конец float[4]), там все посчитать и залить обратно. Поэтому если нужна арифметика цветов, то лучше использовать свой класс, напр такой
Код
C++ (Qt)
template <class T>
struct ARGB {
T a, rgb[3];
};
Обычно увидев такое "знатоки" начинают воротить нос :) Однако попробуйте сделать тот же оператор + и, возможно, Вы будете удивлены как прекрасно все получается. И проблем с обрезкой никаких. Видимо сложность/трудность только в том что надо сделать что-то свое (пусть на копейку) - а вдруг это окажется  "позорным велосипедом"?  :)

При желании конечно можно сделать все private и "накрутить песики" get/set, потом "зафрендить" оператоы/ф-ции. Но я в упор не вижу зачем такой фигней заниматься. Да, я читал эти книги, и даже помню категорическое "никаких исключений!" в одной из них. Но я так не считаю  :)


Название: Re: Сложить 2 QColor
Отправлено: Bepec от Январь 28, 2013, 13:15
Эммм... Вам не кажется, что вы только что описали qRgb классик? И к чему эта тафтология, если всё равно ваш "оператор", который вы не привели будет рассчитан на узкий спектр задач?


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 28, 2013, 13:18
QColor - прекрасный класс для перегонки из одной модели в другую, но для арифметики цветов он совершенно непригоден.
Точно, именно на это я намекал. Ну и его никто не навязывает для этой арифметики, как и никто не заставляеттак хранить картинки - QVector<QColor>. :)



Название: Re: Сложить 2 QColor
Отправлено: m_ax от Январь 28, 2013, 13:58
Эммм... Вам не кажется, что вы только что описали qRgb классик? И к чему эта тафтология, если всё равно ваш "оператор", который вы не привели будет рассчитан на узкий спектр задач?

QRgb - это не классик.. это просто псевдоним на unsigned int


Название: Re: Сложить 2 QColor
Отправлено: Bepec от Январь 28, 2013, 14:29
та я знаю :) Там как раз и будет гениальная простота работы, как и хочет Igors - без интерфейсов и прочего.


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 29, 2013, 09:39
Точно, именно на это я намекал.
Что-то слишком тонко  :)

Эммм... Вам не кажется, что вы только что описали qRgb классик?
Как всегда не въехали и не разобрались. qRgb здесь не годится

И к чему эта тафтология, если всё равно ваш "оператор", который вы не привели
Как всегда верещите и захламляете тему  :)


Название: Re: Сложить 2 QColor
Отправлено: Bepec от Январь 29, 2013, 09:43
Примерно пять ваших тем сводятся к "А как сделать вот так и чтобы оно было универсальным и учитывало все мои невысказанные сначала требования".
Может хватит гоняться за идеалом и будоражить остальных?


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 29, 2013, 09:44
Что-то слишком тонко  :)
Тонко?? Да по моему толще не куда:
Все зависит от контекста его использования (оператора+): для эпизодического сложения двух цветов - он хорош, для складывания массива цветов на время - плох.
Как, в прочем, и все в программирование. :)


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 29, 2013, 09:57
Все зависит от контекста его использования (оператора+): для эпизодического сложения двух цветов - он хорош, для складывания массива цветов на время - плох.
Как, в прочем, и все в программирование. :)
Не вижу чем Ваш оператор плох для сложения массива - да, вероятно альфа быстро переполнится, но все RGB сложены будут. Др дело напр так
Код
C++ (Qt)
QColor average = (c1 + c2) / 2;
 
Это не дает правильный результат, поэтому лучше не начинать городить операторы, а ограничиться ф-цией.
 
А с концепцией/философией я конечно согласен  :)


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 29, 2013, 09:59
Не вижу чем Ваш оператор плох для сложения массива
Тем, что для массива можно написать более эффективную реализацию. :)

Др дело напр так
Код
C++ (Qt)
QColor average = (c1 + c2) / 2;
 
Это не дает правильный результат, поэтому лучше не начинать городить операторы, а ограничиться ф-цией.

Для начала нужно понять, что здесь происходит, а потом уже разбираться, почему это не дает правильный результат. ;)


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 29, 2013, 17:16
Для начала нужно понять, что здесь происходит, а потом уже разбираться, почему это не дает правильный результат. ;)
А это тоже непонятно?
Код
C++ (Qt)
QPoint middle = (pt1 + pt2) / 2;
 
:)


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 29, 2013, 17:23
А это тоже непонятно?
Код
C++ (Qt)
QPoint middle = (pt1 + pt2) / 2;
 
:)

А как вам такое: ;)
Код
C++ (Qt)
QPoint middle = (pt1 + pt2) ^ 2;
 


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 29, 2013, 17:40
А как вам такое: ;)
Код
C++ (Qt)
QPoint middle = (pt1 + pt2) ^ 2;
 
А вот в книжках пишут что перекрытые операторы должны иметь точно такой же смысл как в C, т.е. как для простых типов (напр int, double). А поскольку Вы знаете в 100 раз больше - Ваш намек на неоднозначность оператора / меня удивляет  :)


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 29, 2013, 17:42
Ваш намек на неоднозначность оператора / меня удивляет  :)
Для цвета он не однозначен. Да. Также, пожалуй, как и для точки. :)
Ну не понимаю я как цвета можно складывать, умножать и делить. :)


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 29, 2013, 18:03
Для цвета он не однозначен. Да. Также, пожалуй, как и для точки. :)
Ну не понимаю я как цвета можно складывать, умножать и делить. :)
Любую точку можно представить как вектор из начала координат (0, 0, 0). То же самое и для цвета. А для векторов арифметика прекрасно определена и интуитивна.

Ну вот напр на мониторе видим 100% красный. Поделим на 2 - ну 50% красного. Добавим 100% зеленого, результат = оранжевый. Чего ж нельзя-то?  :)


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 29, 2013, 18:10
Любую точку можно представить как вектор из начала координат (0, 0, 0). То же самое и для цвета. А для векторов арифметика прекрасно определена и интуитивна.

Ну вот напр на мониторе видим 100% красный. Поделим на 2 - ну 50% красного. Добавим 100% зеленого, результат = оранжевый. Чего ж нельзя-то?  :)
Вы сейчас рассказали о соглашениях. Если о них сообщать в документации, то конечно это можно использовать.
А если в QColor лежит цвет в HSV, то что я должен додумать, видя его деление на 15? ;)


Название: Re: Сложить 2 QColor
Отправлено: m_ax от Январь 29, 2013, 18:56
Я бы не стал для такого объекта, как цвет (ARGB) переопределять оператор +.
Во-первых, в отличии от вектора, для цвета нарушается коммутативность суммы:
например с1 + с2 + с3 неравно с1 + с3 + с2.
А это неожиданный для конечного пользователя результат уже может сломать ему мозг в поисках ошибки (а она рано или поздно случится)..

Если уж так необходимо их складывать (цвета), то логичнее написать для этого специальную функцию и хорошенько её задокументировать..
 
 


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 29, 2013, 19:02
Вы сейчас рассказали о соглашениях. Если о них сообщать в документации, то конечно это можно использовать.
А если в QColor лежит цвет в HSV, то что я должен додумать, видя его деление на 15? ;)
Ну так я и не предлагал делать никаких операторов для класса QColor, напротив, я считаю эту затею неудачной, о чем подробно сказал выше. Просто все (увы, включая Вас) начинают запрягать QColor, хотя это совершенно неуместно. Подобный эффект часто наблюдается и с др задачами/классами, напр QRegExp. Из инструментария выбирается класс наиболее подходящий - и (почему-то) автоматычно считается что использовать его = гуд. Но ведь это совсем не так. Собственно поэтому я и создал эту тему  :)


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 29, 2013, 19:03
Я бы не стал для такого объекта, как цвет (ARGB) переопределять оператор +.
Во-первых, в отличии от вектора, для цвета нарушается коммутативность суммы:
например с1 + с2 + с3 неравно с1 + с3 + с2.
А это неожиданный для конечного пользователя результат уже может сломать ему мозг в поисках ошибки (а она рано или поздно случится)..
Согласен, но давайте смотреть ширше. Кто нас заставляет делать обрезку (вследствие чего получается неоднозначность)? Почему мы должны ютиться в рамках QColor который для этого совсем не предназначен? Давайте введем свой класс который не имеет проблем с арифметикой


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 29, 2013, 19:06
Ну так я и не предлагал делать никаких операторов для класса QColor, напротив, я считаю эту затею неудачной, о чем подробно сказал выше.
Ну так я в первом ответе вам это и написал, а m_ax в последнем. :)

Еще в теме немного поучаствовал Верес, не не особо...
Поэтому я совершенно не понимаю, кто кроме вас начал запрягать QColor. :)


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 29, 2013, 19:17
Ну так я в первом ответе вам это и написал, а m_ax в последнем. :)

Еще в теме немного поучаствовал Верес, не не особо...
Поэтому я совершенно не понимаю, кто кроме вас начал запрягать QColor. :)
А разве я говорил что результат должен быть в QColor? Более того, никто не мешал Вам подвергнуть суровой (и справедливой) критике сложение 2 QColor!

Это ж была провокация на китайско-финской границе (вполне успешная  :)).


Название: Re: Сложить 2 QColor
Отправлено: m_ax от Январь 29, 2013, 19:18
Я бы не стал для такого объекта, как цвет (ARGB) переопределять оператор +.
Во-первых, в отличии от вектора, для цвета нарушается коммутативность суммы:
например с1 + с2 + с3 неравно с1 + с3 + с2.
А это неожиданный для конечного пользователя результат уже может сломать ему мозг в поисках ошибки (а она рано или поздно случится)..
Согласен, но давайте смотреть ширше. Кто нас заставляет делать обрезку (вследствие чего получается неоднозначность)? Почему мы должны ютиться в рамках QColor который для этого совсем не предназначен? Давайте введем свой класс который не имеет проблем с арифметикой
Давайте введём) Например, QPoint таких проблем не имеет) И для него реализованы все арифметические операции)
Осталось научиться делать каст из QPoint в QColor и обратно :)


Название: Re: Сложить 2 QColor
Отправлено: Bepec от Январь 29, 2013, 19:24
Это ж была провокация на китайско-финской границе (вполне успешная  :)).
Я собственно участвовал мало, ибо мой разум не в силах постигнуть, зачем складывать два цвета.

Так же видно, что это провокация.

PS немного подумал и изменил свою предыдуще высказанную точку зрения - провоцируйте, Igors, и побольше. Натренируете у мастеров невозмутимость :)


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 29, 2013, 19:42
А разве я говорил что результат должен быть в QColor? Более того, никто не мешал Вам подвергнуть суровой (и справедливой) критике сложение 2 QColor!
А почему это нужно было критиковать? Да к тому же заслуженно? :)
Мы реализовали оператор для непонятной (по крайней мере мне) операции по предложенной вами математике, только и всего.
Критиковать математику? Я еще раз скажу - для меня до сих пор непонятна операция сложения двух цветов. Я бы делал оператор, даже для такой математики:
R = G * B;
G = R * B;
B = R * G;
:)

Это ж была провокация на китайско-финской границе (вполне успешная  :)).
В чем она заключалась? :)


Название: Re: Сложить 2 QColor
Отправлено: Igors от Январь 30, 2013, 12:52
Давайте введём) Например, QPoint таких проблем не имеет) И для него реализованы все арифметические операции)
Осталось научиться делать каст из QPoint в QColor и обратно :)
А чего не std::valarray<T>?  :) К сожалению, не проходит - альфа обрабатывается не однообразно. Конечно если такое стандартное есть - лучше его, но если нет - не умирать же  :)

Я еще раз скажу - для меня до сих пор непонятна операция сложения двух цветов.
Так это самое обычное/рядовое дело. Напр Вам нужно заменить пиксель средним значением N соседей (заблюрить QImage). Или раскрасить что-то градиентом. Вот и нужна сначала сумма цветов.

Я бы делал оператор, даже для такой математики:
Ну для такой не надо :) А вот чтобы Вы делали если нужно сложить/осреднить в HSV/HSL модели? Это имеет смысл, результаты могут быть лучше чем в RGB. Очевидно saturation и value вычисляются так же. Но что делать с hue?


Название: Re: Сложить 2 QColor
Отправлено: Old от Январь 30, 2013, 22:08
А вот чтобы Вы делали если нужно сложить/осреднить в HSV/HSL модели?
Я бы пошел читать теорию цветовых моделей. :)