Russian Qt Forum
Ноябрь 23, 2024, 15:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Градиент цвета  (Прочитано 8903 раз)
PulSar.CE3194694
Гость
« : Февраль 03, 2013, 17:58 »

Добрый вечер.
Подскажите, как реализовать градиент цвета так, чтобы можно было узнать промежуточное значение? Т.е.: есть некоторая шкала, которой я хочу сопоставить цвет (например, как на географических картах). Для этого самому большому значения шкалы я задаю верхний цвет, а для самого маленького - нижний цвет. А далее хочу узнать, какой цвет имеет некоторое промежуточное значение. Думал это есть в классе QGradient, но ничего не оказалось. В принципе я знаю один способ, но он несколько ущербен, т.к. не позволяет использовать все цвета rgb.
Что посоветуете?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #1 : Февраль 04, 2013, 08:11 »

Из простых костылей: создаешь QGradient, заполняешь им QBitmap нужного размера (в соответствии с требуемой точность значений), и получаешь значение требуемого цвета через getPixel.
Записан
PulSar.CE3194694
Гость
« Ответ #2 : Февраль 04, 2013, 09:11 »

Интересный костыль. А если нет возможности использовать paintEvent?
Записан
Bepec
Гость
« Ответ #3 : Февраль 04, 2013, 11:28 »

Тогда отрисовываете всё на QImage и суёте его в label.
Записан
PulSar.CE3194694
Гость
« Ответ #4 : Февраль 04, 2013, 12:32 »

Тогда отрисовываете всё на QImage и суёте его в label.
Как на нем можно что-то отрисовать, если для этого нужен paintEvent, который есть только в виджетах.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Февраль 04, 2013, 13:01 »

Отрисовка в QImage делается синхронно и с виджетами никак не пересекается.
Записан

Qt 5.11/4.8.7 (X11/Win)
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #6 : Февраль 04, 2013, 13:04 »

Интересный костыль. А если нет возможности использовать paintEvent?
А зачем тебе paintEvent для отрисовки на QBitMap?
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Февраль 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);
}
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #8 : Февраль 05, 2013, 08:38 »

Есть простая арифметическая операция, называется взвешивание или интерполяция.
А если у него градиент не линейный?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Февраль 05, 2013, 10:24 »

А если у него градиент не линейный?
Для этого самому большому значения шкалы я задаю верхний цвет, а для самого маленького - нижний цвет.
ТС вроде как линейный имеет в виду.
Записан

Qt 5.11/4.8.7 (X11/Win)
PulSar.CE3194694
Гость
« Ответ #10 : Февраль 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]
Как раз то, что нужно, спасибо. Не знал, каким образом связать мою шкалу со сразу тремя компонентами цвета.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #11 : Февраль 05, 2013, 12:56 »

ТС вроде как линейный имеет в виду.
Ну если смотреть сюда
Например, как на географических картах
то совсем не факт. Тем более что если речь идёт о понятиях высота/глубина, то там вовсе не два цвета в градиенте. Впрочем, ТС вроде бы уже доволен, так что - умолкаю.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Февраль 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;
 
Записан
Ilya_181
Новичок

Offline Offline

Сообщений: 33


Просмотр профиля
« Ответ #13 : Август 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 что это?
Помогите!
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #14 : Август 30, 2017, 17:25 »

minC, maxC - начальный и конечный цвета для градиента. Ссылка - чтобы не происходило копирования.
minV, maxV - задают диапазон значений.
val - значение (лежащее в диапазоне minV <= val <= maxV) для которого надо рассчитать промежуточный цвет.

Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.217 секунд. Запросов: 22.