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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Автоматический выбор цветов  (Прочитано 5922 раз)
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 194


Просмотр профиля
« : Декабрь 21, 2014, 18:49 »

Здравствуйте.
Задача такая. Делается графическая программа на основе QGraphicsView. На графике будет довольно много однотипных элементов, которые хотелось бы различать в том числе по цвету.
Чтобы не грузить задачей выбора цвета пользователя, цвет очередному элементу хотелось бы присваивать автоматически. По-видимому, надо сделать базовый набор цветов, заведомо отличающихся от фона, и циклически выдавать их каждому новому элементу по запросу.

Нет ли случайно класса для Qt, который автоматизирует эту задачу?
Записан

Мои проекты на Qt: DoubleContact, LInvert
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Декабрь 21, 2014, 19:00 »

Нет.
Записан

DarkHobbit
Самовар
**
Offline Offline

Сообщений: 194


Просмотр профиля
« Ответ #2 : Декабрь 21, 2014, 19:15 »

Спасибо, значит, будем велосипедить...
Записан

Мои проекты на Qt: DoubleContact, LInvert
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 194


Просмотр профиля
« Ответ #3 : Январь 02, 2015, 18:15 »

Вот такой велосипед написал:
https://github.com/DarkHobbit/chronoline/blob/master/src/colorautoselector.h
https://github.com/DarkHobbit/chronoline/blob/master/src/colorautoselector.cpp
(о проекте chronoline, для которого он понадобился, я тоже расскажу, но в отдельной теме).
Создание каждого объекта класса ColorAutoSelector даёт относительно независимую очередь цветов. Это нужно, например, если график логически поделён на несколько непересекающихся частей, и между ними уникальность цветов не нужна (а хороших цветов всегда не хватает). Рандомизации нет, поэтому чтобы эти части не выглядели совсем уж уныло, в конструкторе задаётся initialShift - смещение индекса относительно начала массива основных цветов.
Очередной цвет возвращается методом nextColor(). Чтобы не напороться на цвет фона или похожий на него, есть понятие зарезервированных цветов. Вызвав, например, addReservedColor(Qt::black), можно исключить чёрный цвет из списка выдаваемых.
В классе есть что совершенствовать, например, добавить ту же самую рандомизацию. Цвета, включенные в baseColors, и их порядок - также довольно спорный момент. Можно было бы пытаться при добавлении зарезервированного цвета исключать не только его самого, но и те, которые пользователь визуально может с ним спутать, но тут уже целый ИИ нужен.

Есть бага - если покрыть зарезервированными цветами весь baseColors, вызов nextColor() утащит программу в бесконечный цикл. Это в принципе, можно отследить в вызывающей программе (например, в chronoline на данный момент такая ситуация возникать не должна), но пожалуй, стоит добавить проверку в addReservedColor. Подумаю.
« Последнее редактирование: Январь 02, 2015, 18:38 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Январь 03, 2015, 09:37 »

Если что-то простое (без ColorPicker'ов) можно так
Код
C++ (Qt)
QColor NextColor( const QColor & src )
{
QColor dst;
dst.setHsv((src.hue() + 256  / 16) % 256, src.saturation(), src.value(), src.alpha());
return dst;
}
Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 194


Просмотр профиля
« Ответ #5 : Январь 03, 2015, 20:30 »

Что-то у меня при таком методе цвета очень быстро скатились к жёлтому и начали повторяться (начинал последовательность с Qt::red). Возможно, это зависит от того, какой цвет взять начальным...
« Последнее редактирование: Январь 03, 2015, 23:35 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Январь 04, 2015, 08:56 »

Что-то у меня при таком методе цвета очень быстро скатились к жёлтому и начали повторяться (начинал последовательность с Qt::red). Возможно, это зависит от того, какой цвет взять начальным...
У меня ничего не скатилось (аттач). А повторяться будет все. Если нужно больше цветов - модифицировать value (тоже в HSV модели). Мысль назначить цвета по умолчанию здравая, но особо упорствовать/раздувать ее не стоит, в любом случае юзверь должен иметь возможность назначить цвет сам - если захочет.
Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 194


Просмотр профиля
« Ответ #7 : Январь 04, 2015, 23:59 »

Ага, вижу.
Тоже вариант, правда, мне не очень при этом понравилось, что соседние цвета - они и по цвету соседние. Я свой массив подбирал так, чтобы соседние цвета как раз различались. Насколько это получилось - судить не мне.
Цитировать
Мысль назначить цвета по умолчанию здравая, но особо упорствовать/раздувать ее не стоит, в любом случае юзверь должен иметь возможность назначить цвет сам - если захочет.
Да, разумеется, в библиотеке, которая мой класс вызывает, я предусмотрел оба варианта.
« Последнее редактирование: Январь 05, 2015, 00:01 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Январь 05, 2015, 09:08 »

правда, мне не очень при этом понравилось, что соседние цвета - они и по цвету соседние.
Тогда напр так
Код
C++ (Qt)
src.hue() + 256 / 16 * 5) % 256
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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