Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Hrundel от Ноябрь 27, 2012, 20:38



Название: Прошу совета по теме создания цветовой палитры
Отправлено: Hrundel от Ноябрь 27, 2012, 20:38
Всем привет,
продолжаю работу над семестровым проектом по разработки GUI. Некоторые уже видели мои посты с полукруглыми панелями.
Теперь вот на полукруглой панели собираюсь сделать цветовую палитру.
Все у тех же ребят из ArtRage это выглядит так.

(http://i47.fastpic.ru/big/2012/1127/84/9d294c8576d6c6dc12b343ea62d45b84.jpg)

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

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

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

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

Будьте добры, дайте дельный совет. Покажите направление.


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Hrundel от Ноябрь 28, 2012, 01:09
Хотя со вторым широким кольцом можно наверное сделать и так:

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

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


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Bepec от Ноябрь 28, 2012, 07:26
Залить градиентов нельзя?
Он же вам как раз подходит.
А значение тупо получать цветом пикселя.

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

PS % на 60 уверен, что такое сделать можно.


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: xokc от Ноябрь 28, 2012, 08:50
QLinearGradient с несколькими опорными точками.
Он на то и Linear, что градиент по прямой (в одном направлении) строить будет, а здесь нужно в двух, да ещё и по кругу.

Я бы сделал статический 8-битный QImage с палитрой, изменяемой в зависимости от цвета, выбранного во внешнем кольце. И никаких плясок с градиентами.
Да, а в чём смысл вычислять цвет пикселя по радиане? Он же и так уже есть в самом пикселе?


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Nitro от Ноябрь 28, 2012, 10:19
Да, а в чём смысл вычислять цвет пикселя по радиане? Он же и так уже есть в самом пикселе?

А по моему правильно если он собирается менять hue. Там же цвет от 0 до 360. Просто получил градус, пересчитал его, вот тебе и цвет.


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: xokc от Ноябрь 28, 2012, 13:48
А по моему правильно если он собирается менять hue. Там же цвет от 0 до 360. Просто получил градус, пересчитал его, вот тебе и цвет.
Это правильное замечание с академической точки зрения, если бы речь шла о моём упрощении при использовании в качестве базового 8-битного QImage с палитрой (там только 256 цветов, но
с точки зрения простоты реализации, я бы этим пренебрёг). Но с точки расчета цвета не понял. Пиксель под курсором ведь уже и так светится нужным цветом - зачем его заново рассчитывать?


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Igors от Ноябрь 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


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: twp от Ноябрь 28, 2012, 14:31
а QConicalGradient не подойдет?
его можно глянуть в демке demos/gradients/


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Nitro от Ноябрь 28, 2012, 14:40
Но с точки расчета цвета не понял. Пиксель под курсором ведь уже и так светится нужным цветом - зачем его заново рассчитывать?

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


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Igors от Ноябрь 28, 2012, 14:43
а QConicalGradient не подойдет?
его можно глянуть в демке demos/gradients/
Удивлен этим (и другими) ответами. Конечно "попользоваться готовым" - дело хорошее, но во всем же надо знать меру. Здесь самому написать быстрее чем пример найти (только). Или это уже "на принцип" пошло (типа "дело чести")?  :)


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: twp от Ноябрь 28, 2012, 15:17
ну понятное дело, что изобретать велосипед очень полезно хотя бы для своего же развития :) Хотя скопипастить готовый код почти одно и тоже, что использовать готовый класс  (имхо). Я только дал еще одну идею, а пускай ТС сам выбирает, что ему лучше подойдет.


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Hrundel от Ноябрь 28, 2012, 19:49
Опять всем привет, и спасибо за советы.
Уже начал делать. Вроде бы, пока, все получается. :)
Отвечу на некоторые комментарии.
Ну, вообще-то я еще только учусь и опыта в Qt всего два месяца или чуть больше, поэтому хочу все делать сам. Особенно велосипеды. На них можно быстрее научиться.

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

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

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

PS И персональное спасибо Igors'у за код  ;D


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: twp от Ноябрь 29, 2012, 00:06
На счет градиентов - не все так просто потому, что там надо два градиента комбинировать. А это навряд ли возможно.
можно и больше, по сути нет ограничения


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Hrundel от Ноябрь 29, 2012, 00:57
Ну, вот что получилось:

(http://i26.fastpic.ru/big/2012/1129/6f/e4de8254473e4c3fdbc65dbe43d48b6f.jpg)

теперь Hue я получаю (там в нижнем углу выводится значение) и с его помощью надо теперь пересчитать картинку.
 ???
А как?  :D Вот этого то я пока и не знаю.
И признаюсь честно - до сих пор с подобными задачами не сталкивался, поэтому даже не знаю с чего подойти.
Я так понимаю нужно теперь как-то весь Pixmap попиксельно обходить и менять значение для Hue для каждого пикселя. Правильно?
Или так очень медленно будет?


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Hrundel от Ноябрь 29, 2012, 01:00
можно и больше, по сути нет ограничения

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


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: xokc от Ноябрь 29, 2012, 09:11
Я так понимаю нужно теперь как-то весь Pixmap попиксельно обходить и менять значение для Hue для каждого пикселя. Правильно?
Или так очень медленно будет?
На оба вопроса - да. Будет быстрее, если использовать SIMD инструкции процессора, но в рамках курсовика это уже видимо перебор. Попробуй - может устроит быстродействие и так.


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Igors от Ноябрь 29, 2012, 09:41
Я так понимаю нужно теперь как-то весь Pixmap попиксельно обходить и менять значение для Hue для каждого пикселя. Правильно?
Нет :) Просто опять все рисуете но для второго кольца используете найденное значение hue.


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: GreatSnake от Ноябрь 29, 2012, 11:16
Или так очень медленно будет?
Да, так будет очень медленно, т.к. Pixmap хранится на стороне графической системы.
Для таких задач нужно из QPixmap-а получить QImage и уже всю обработку делать в нём.
Я бы вообще всё делал в QImage, т.к. QPixmap оправдан только для статичных изображений.
К тому же у нас есть double-buffer.


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Igors от Ноябрь 29, 2012, 12:08
Что-то заехали "явно не туда" :) Какой QPixmap? Что Вы собираетесь в нем хранить если нужно перерисовывать при каждом клике пользователя? Зачем "обходить имедж" и что-то менять? Так получается куда больше расчетов чем при простой перерисовке всего. Откуда взялся миф о "медленности"? На пиксель: один atan2 + sqrt + setHsv - так это кошкины слезы, а не расчеты.

Выложите проект - там на-все про-все час, дольше обсуждаем


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: GreatSnake от Ноябрь 29, 2012, 12:16
Если вопрос ко мне, то я имел в виду не частный случай)


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Hrundel от Ноябрь 29, 2012, 13:29
ОК, тогда выкладываю проект,
а то так мы говорим очень не предметно, а в связи с тем, что мои знания в этой области крайне ограничены (я всего то на третьем семестре)
то мне вообще трудно принимать участие в обсуждении, когда все становится таким конкретным и неконкретным одновременно.

Вы, правда, сильно не критикуйте, собираю для начала так, чтобы работало. Код еще не причесан.


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Hrundel от Ноябрь 29, 2012, 13:29
Второй файл из архива

Кстати, базовым цветом для второго кольца я взял красный потому, что его Hue = 0.0 = 1.0 (Как ни парадоксально это звучит :) )


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Igors от Ноябрь 29, 2012, 16:57
В конце-концов "склеил" архивы и распаковал. Проект создался и запустился нормально, но палетка почему-то не показывается  ??? После отчаянных но безуспешных попыток разобраться в Вашем коде - плюнул и написал с нуля (attach)

Рамочки и др бижутерию сами дорисуете


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Hrundel от Ноябрь 29, 2012, 18:24
Аааааааааааааааааах ёлки-палки, воооооооооон как !!!!!!!  ;D  ;D  ;D

А я думал надо вообще готовую картинку брать и ее перерисовывать.
Да, Igors, огромная благодарность тебе. Все очень понятно и ясно теперь. Большое, большое спасибо.
Думаю, что многим наверное тоже будет интересно.

Да на таком примере, я на самом деле многому научусь.


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Hrundel от Ноябрь 29, 2012, 18:49
Ну тогда уважаемые господа, позвольте закончить обсуждение словами большой благодарности ко всем кто принимал участие в обсуждении, и кто стремился помочь словом и делом.

Еще раз персональная благодарность Igors

И скажу вам точно, с такими людьми как вы можно многого добиться!
Спасибо!


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Igors от Ноябрь 29, 2012, 19:43
Да на таком примере, я на самом деле многому научусь.
Я прекрасно понимаю что это только "так говорится", но если есть желание - вот пара задачек

1) Сделайте чтобы размеры по осям могли быть неодинаковы (четвертушка эллипса вместо круга)
2) Видите как прет алиас ("зубы", jaggy) там где кольца соприкасаются. Уберите


Название: Re: Прошу совета по теме создания цветовой палитры
Отправлено: Hrundel от Ноябрь 29, 2012, 19:51
2) Видите как прет алиас ("зубы", jaggy) там где кольца соприкасаются. Уберите

Кстати, вот этим уже начал заниматься :D

Правда все-равно скоро придется бросить проект. Хотя, очень не хочется. Но нужно заниматься английским. Я его уже 2 раза завалил. Если в третий раз завалю, выкинут из универа.