Russian Qt Forum

Qt => Вопросы новичков => Тема начата: PulSar.CE3194694 от Февраль 03, 2013, 17:58



Название: Градиент цвета
Отправлено: PulSar.CE3194694 от Февраль 03, 2013, 17:58
Добрый вечер.
Подскажите, как реализовать градиент цвета так, чтобы можно было узнать промежуточное значение? Т.е.: есть некоторая шкала, которой я хочу сопоставить цвет (например, как на географических картах). Для этого самому большому значения шкалы я задаю верхний цвет, а для самого маленького - нижний цвет. А далее хочу узнать, какой цвет имеет некоторое промежуточное значение. Думал это есть в классе QGradient, но ничего не оказалось. В принципе я знаю один способ, но он несколько ущербен, т.к. не позволяет использовать все цвета rgb.
Что посоветуете?


Название: Re: Градиент цвета
Отправлено: xokc от Февраль 04, 2013, 08:11
Из простых костылей: создаешь QGradient, заполняешь им QBitmap нужного размера (в соответствии с требуемой точность значений), и получаешь значение требуемого цвета через getPixel.


Название: Re: Градиент цвета
Отправлено: PulSar.CE3194694 от Февраль 04, 2013, 09:11
Интересный костыль. А если нет возможности использовать paintEvent?


Название: Re: Градиент цвета
Отправлено: Bepec от Февраль 04, 2013, 11:28
Тогда отрисовываете всё на QImage и суёте его в label.


Название: Re: Градиент цвета
Отправлено: PulSar.CE3194694 от Февраль 04, 2013, 12:32
Тогда отрисовываете всё на QImage и суёте его в label.
Как на нем можно что-то отрисовать, если для этого нужен paintEvent, который есть только в виджетах.


Название: Re: Градиент цвета
Отправлено: GreatSnake от Февраль 04, 2013, 13:01
Отрисовка в QImage делается синхронно и с виджетами никак не пересекается.


Название: Re: Градиент цвета
Отправлено: Kurles от Февраль 04, 2013, 13:04
Интересный костыль. А если нет возможности использовать paintEvent?
А зачем тебе paintEvent для отрисовки на QBitMap?


Название: Re: Градиент цвета
Отправлено: Igors от Февраль 04, 2013, 13:25
Добрый вечер.
Подскажите, как реализовать градиент цвета так, чтобы можно было узнать промежуточное значение? Т.е.: есть некоторая шкала, которой я хочу сопоставить цвет (например, как на географических картах). Для этого самому большому значения шкалы я задаю верхний цвет, а для самого маленького - нижний цвет. А далее хочу узнать, какой цвет имеет некоторое промежуточное значение. Думал это есть в классе QGradient, но ничего не оказалось. В принципе я знаю один способ, но он несколько ущербен, т.к. не позволяет использовать все цвета rgb.
Что посоветуете?
Есть простая арифметическая операция, называется взвешивание или интерполяция.
Код
C++ (Qt)
QRgb Interpolate( const QRgb & minC, const QRgb & maxC, qreal minV, qreal maxV, qreal val )
{
 qreal w1 = (val - minV) / (maxV - minV);  // вес maхC
 return qRgb(qRed(minC) * (1 - w1) + qRed(maxC) * w1,
                   qGreen(minC) * (1 - w1) + qGreen(maxC) * w1,
                   qBlue(minC) * (1 - w1) + qBlue(maxC) * w1);
}


Название: Re: Градиент цвета
Отправлено: xokc от Февраль 05, 2013, 08:38
Есть простая арифметическая операция, называется взвешивание или интерполяция.
А если у него градиент не линейный?


Название: Re: Градиент цвета
Отправлено: GreatSnake от Февраль 05, 2013, 10:24
А если у него градиент не линейный?
Для этого самому большому значения шкалы я задаю верхний цвет, а для самого маленького - нижний цвет.
ТС вроде как линейный имеет в виду.


Название: Re: Градиент цвета
Отправлено: PulSar.CE3194694 от Февраль 05, 2013, 11:38
Код:
[quote author=Igors link=topic=24107.msg171091#msg171091 date=1359973520]
QRgb Interpolate( const QRgb & minC, const QRgb & maxC, qreal minV, qreal maxV, qreal val )
{
  qreal w1 = (val - minV) / (maxV - minV);  // вес maхC
  return qRgb(qRed(minC) * (1 - w1) + qRed(maxC) * w1,
                    qGreen(minC) * (1 - w1) + qGreen(maxC) * w1,
                    qBlue(minC) * (1 - w1) + qBlue(maxC) * w1);
}
[/quote]
Как раз то, что нужно, спасибо. Не знал, каким образом связать мою шкалу со сразу тремя компонентами цвета.


Название: Re: Градиент цвета
Отправлено: xokc от Февраль 05, 2013, 12:56
ТС вроде как линейный имеет в виду.
Ну если смотреть сюда
Например, как на географических картах
то совсем не факт. Тем более что если речь идёт о понятиях высота/глубина, то там вовсе не два цвета в градиенте. Впрочем, ТС вроде бы уже доволен, так что - умолкаю.


Название: Re: Градиент цвета
Отправлено: Igors от Февраль 05, 2013, 13:22
А если у него градиент не линейный?
Ну это действительно катастрофа  :)
Код
C++ (Qt)
qreal w0 = 1 - (val - minV) / (maxV - minV);  // вес minC
w0 = 3 * w0 * w0 - 2 * w0 * w0 * w0;  // популярный эрмитный переход
// w0 = pow(w0, theK);   // или степень
w1 = 1 - w0;
 


Название: Re: Градиент цвета
Отправлено: Ilya_181 от Август 30, 2017, 16:55
Есть простая арифметическая операция, называется взвешивание или интерполяция.
Код
C++ (Qt)
QRgb Interpolate( const QRgb & minC, const QRgb & maxC, qreal minV, qreal maxV, qreal val )
{
 qreal w1 = (val - minV) / (maxV - minV);  // вес maхC
 return qRgb(qRed(minC) * (1 - w1) + qRed(maxC) * w1,
                   qGreen(minC) * (1 - w1) + qGreen(maxC) * w1,
                   qBlue(minC) * (1 - w1) + qBlue(maxC) * w1);
}
[/quote]

Не могу понять
1. что значит maxC и minV?  И почему они по ссылке передаются?
2. что значить minV и maxV?   
3. val что это?
Помогите!


Название: Re: Градиент цвета
Отправлено: Apktyc от Август 30, 2017, 17:25
minC, maxC - начальный и конечный цвета для градиента. Ссылка - чтобы не происходило копирования.
minV, maxV - задают диапазон значений.
val - значение (лежащее в диапазоне minV <= val <= maxV) для которого надо рассчитать промежуточный цвет.



Название: Re: Градиент цвета
Отправлено: Ilya_181 от Август 30, 2017, 17:38
minC, maxC - начальный и конечный цвета для градиента. Ссылка - чтобы не происходило копирования.
minV, maxV - задают диапазон значений.
val - значение (лежащее в диапазоне minV <= val <= maxV) для которого надо рассчитать промежуточный цвет.


Код
C++ (Qt)
QRgb Interpolate( const QRgb & minC, const QRgb & maxC, qreal minV, qreal maxV, qreal val )
{
 qreal w1 = (val - minV) / (maxV - minV);  // вес maхC
 return qRgb(qRed(minC) * (1 - w1) + qRed(maxC) * w1,
                   qGreen(minC) * (1 - w1) + qGreen(maxC) * w1,
                   qBlue(minC) * (1 - w1) + qBlue(maxC) * w1);
}

Для Qt так будет верно?
Interpolate(Qt::green, Qt::red, 0, 255, 44);