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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Прошу совета по теме создания цветовой палитры  (Прочитано 15149 раз)
Hrundel
Гость
« : Ноябрь 27, 2012, 20:38 »

Всем привет,
продолжаю работу над семестровым проектом по разработки GUI. Некоторые уже видели мои посты с полукруглыми панелями.
Теперь вот на полукруглой панели собираюсь сделать цветовую палитру.
Все у тех же ребят из ArtRage это выглядит так.



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

Сказать честно, пока у меня есть только такая мысль:

Внешнее кольцо с выбором цвета поместить статическим PixMapom, а цвет просто считать по радиане.
Следующее широкое кольцо - не знаю что и делать. Прошу вашего совета.
третье с надписью не нужно
и четвертое тоже не знаю.

Хотя с четвертым все же попроще. Просто нарисовать векторно и заливать цветом

Будьте добры, дайте дельный совет. Покажите направление.
« Последнее редактирование: Ноябрь 28, 2012, 00:00 от Hrundel » Записан
Hrundel
Гость
« Ответ #1 : Ноябрь 28, 2012, 01:09 »

Хотя со вторым широким кольцом можно наверное сделать и так:

Загрузить картинку как QImage с каким-нибудь "опорным" цветом, а потом смещать ей Hue
а в качестве значения получать пиксель из имиджа и отображать его в четвертом кольце.

Правда тогда сразу следующий вопрос как его изменить этот оттенок.
что-то я в QPaintDevice на первый взгляд ничего похожего не нашел.
« Последнее редактирование: Ноябрь 28, 2012, 01:51 от Hrundel » Записан
Bepec
Гость
« Ответ #2 : Ноябрь 28, 2012, 07:26 »

Залить градиентов нельзя?
Он же вам как раз подходит.
А значение тупо получать цветом пикселя.

QLinearGradient с несколькими опорными точками.

PS % на 60 уверен, что такое сделать можно.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #3 : Ноябрь 28, 2012, 08:50 »

QLinearGradient с несколькими опорными точками.
Он на то и Linear, что градиент по прямой (в одном направлении) строить будет, а здесь нужно в двух, да ещё и по кругу.

Я бы сделал статический 8-битный QImage с палитрой, изменяемой в зависимости от цвета, выбранного во внешнем кольце. И никаких плясок с градиентами.
Да, а в чём смысл вычислять цвет пикселя по радиане? Он же и так уже есть в самом пикселе?
Записан
Nitro
Гость
« Ответ #4 : Ноябрь 28, 2012, 10:19 »

Да, а в чём смысл вычислять цвет пикселя по радиане? Он же и так уже есть в самом пикселе?

А по моему правильно если он собирается менять hue. Там же цвет от 0 до 360. Просто получил градус, пересчитал его, вот тебе и цвет.
« Последнее редактирование: Ноябрь 28, 2012, 10:20 от Nitro » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #5 : Ноябрь 28, 2012, 13:48 »

А по моему правильно если он собирается менять hue. Там же цвет от 0 до 360. Просто получил градус, пересчитал его, вот тебе и цвет.
Это правильное замечание с академической точки зрения, если бы речь шла о моём упрощении при использовании в качестве базового 8-битного QImage с палитрой (там только 256 цветов, но
с точки зрения простоты реализации, я бы этим пренебрёг). Но с точки расчета цвета не понял. Пиксель под курсором ведь уже и так светится нужным цветом - зачем его заново рассчитывать?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Ноябрь 28, 2012, 14:16 »

Рисовать попиксельно. Для каждой точки получаете угол и радиус
Код
C++ (Qt)
QPointF cntr, pt;   // даны центр и текущий пиксель
QColor color;        // цвет точки что надо найти
...
QPointF delta = pt - cntr;
qreal radius = sqrt(delta.x() * delta.x() + delta.y() * delta.y());
qreal hue = (1.0 - atan2(delta.y(), delta.x()) / M_PI) * 2 ;  // угол hue от 0 до 1 по Вашей картинке  
 
Теперь в каком кольце пиксель
Код
C++ (Qt)
qreal radOut;  // радиус всего круга
qreal radIns;  // радиус 2-го кольца
qreal radIns2;  // радиус 4-го
 
if (radius > radOut)  {   // точка вне круга
..
}
else {
 if (radius > radIns)    // внешнее кольцо
   color.setHsvF(hue. 1.0, 1.0);
 else  
    if (radius > radIns2)  {  // второе кольцо
      qreal saturation = (radius - radIns2) / (radIns - radIns2);
      qrell value = 1.0 - hue;  
      color.setHsvF(userHue, saturation, value);  // возможно setHslF (подберете)
    }
}
 
Каждое следующее кольцо использует данное что пользователь выбрал на предыдущем (внешнем). Напр клик в кольцо hue - код тот же, просто сохраняете hue как userHue
« Последнее редактирование: Ноябрь 28, 2012, 15:26 от Igors » Записан
twp
Гость
« Ответ #7 : Ноябрь 28, 2012, 14:31 »

а QConicalGradient не подойдет?
его можно глянуть в демке demos/gradients/
Записан
Nitro
Гость
« Ответ #8 : Ноябрь 28, 2012, 14:40 »

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

Ну, мне кажется только по одной причине. Мы же не знаем какую картинку он там запихнет и на сколько качественной она будет и действительно ли колличество пикселей будет соответствовать количеству возможных цветов.
Если ему точность не нужна, тогда можно пиксель получать, а если он хочет точные значения, тогда угол считать как Igors написал.
Кстати, классно все написал и просто. Я бы замороченее сделал Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Ноябрь 28, 2012, 14:43 »

а QConicalGradient не подойдет?
его можно глянуть в демке demos/gradients/
Удивлен этим (и другими) ответами. Конечно "попользоваться готовым" - дело хорошее, но во всем же надо знать меру. Здесь самому написать быстрее чем пример найти (только). Или это уже "на принцип" пошло (типа "дело чести")?  Улыбающийся
Записан
twp
Гость
« Ответ #10 : Ноябрь 28, 2012, 15:17 »

ну понятное дело, что изобретать велосипед очень полезно хотя бы для своего же развития Улыбающийся Хотя скопипастить готовый код почти одно и тоже, что использовать готовый класс  (имхо). Я только дал еще одну идею, а пускай ТС сам выбирает, что ему лучше подойдет.
Записан
Hrundel
Гость
« Ответ #11 : Ноябрь 28, 2012, 19:49 »

Опять всем привет, и спасибо за советы.
Уже начал делать. Вроде бы, пока, все получается. Улыбающийся
Отвечу на некоторые комментарии.
Ну, вообще-то я еще только учусь и опыта в Qt всего два месяца или чуть больше, поэтому хочу все делать сам. Особенно велосипеды. На них можно быстрее научиться.

Кстати, Nitro прав на счет расчета цвета. Картинка все-равно идеальную градацию цвета не дает из-за размера. Чтобы пиксель из внешнего кольца читать,
надо тогда идеально правильное кольцо с идеально правильной заливкой нарисовать.

На счет градиентов - не все так просто потому, что там надо два градиента комбинировать. А это навряд ли возможно.
Поэтому в любом случае решение с картинкой остается самым лучшим.
Я правда еще не совсем представляю как я буду смещать hue в изображении. Но надеюсь, что найдутся грамотные люди, которые дадут добрый совет.

А вообще, всем большое спасибо за советы и просто человеческую отзывчивость.

PS И персональное спасибо Igors'у за код  Смеющийся
« Последнее редактирование: Ноябрь 28, 2012, 19:52 от Hrundel » Записан
twp
Гость
« Ответ #12 : Ноябрь 29, 2012, 00:06 »

На счет градиентов - не все так просто потому, что там надо два градиента комбинировать. А это навряд ли возможно.
можно и больше, по сути нет ограничения
Записан
Hrundel
Гость
« Ответ #13 : Ноябрь 29, 2012, 00:57 »

Ну, вот что получилось:



теперь Hue я получаю (там в нижнем углу выводится значение) и с его помощью надо теперь пересчитать картинку.
 Непонимающий
А как?  Веселый Вот этого то я пока и не знаю.
И признаюсь честно - до сих пор с подобными задачами не сталкивался, поэтому даже не знаю с чего подойти.
Я так понимаю нужно теперь как-то весь Pixmap попиксельно обходить и менять значение для Hue для каждого пикселя. Правильно?
Или так очень медленно будет?
Записан
Hrundel
Гость
« Ответ #14 : Ноябрь 29, 2012, 01:00 »

можно и больше, по сути нет ограничения

Ну если возможно, то это конечно очень интересно. Надо будет обязательно посмотреть.
« Последнее редактирование: Ноябрь 29, 2012, 01:10 от Hrundel » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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