Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: DarkHobbit от Декабрь 21, 2014, 18:49



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

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


Название: Re: Автоматический выбор цветов
Отправлено: gil9red от Декабрь 21, 2014, 19:00
Нет.


Название: Re: Автоматический выбор цветов
Отправлено: DarkHobbit от Декабрь 21, 2014, 19:15
Спасибо, значит, будем велосипедить...


Название: Мой вариант
Отправлено: DarkHobbit от Январь 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. Подумаю.


Название: Re: Автоматический выбор цветов
Отправлено: Igors от Январь 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;
}


Название: Re: Автоматический выбор цветов
Отправлено: DarkHobbit от Январь 03, 2015, 20:30
Что-то у меня при таком методе цвета очень быстро скатились к жёлтому и начали повторяться (начинал последовательность с Qt::red). Возможно, это зависит от того, какой цвет взять начальным...


Название: Re: Автоматический выбор цветов
Отправлено: Igors от Январь 04, 2015, 08:56
Что-то у меня при таком методе цвета очень быстро скатились к жёлтому и начали повторяться (начинал последовательность с Qt::red). Возможно, это зависит от того, какой цвет взять начальным...
У меня ничего не скатилось (аттач). А повторяться будет все. Если нужно больше цветов - модифицировать value (тоже в HSV модели). Мысль назначить цвета по умолчанию здравая, но особо упорствовать/раздувать ее не стоит, в любом случае юзверь должен иметь возможность назначить цвет сам - если захочет.


Название: Re: Автоматический выбор цветов
Отправлено: DarkHobbit от Январь 04, 2015, 23:59
Ага, вижу.
Тоже вариант, правда, мне не очень при этом понравилось, что соседние цвета - они и по цвету соседние. Я свой массив подбирал так, чтобы соседние цвета как раз различались. Насколько это получилось - судить не мне.
Цитировать
Мысль назначить цвета по умолчанию здравая, но особо упорствовать/раздувать ее не стоит, в любом случае юзверь должен иметь возможность назначить цвет сам - если захочет.
Да, разумеется, в библиотеке, которая мой класс вызывает, я предусмотрел оба варианта.


Название: Re: Автоматический выбор цветов
Отправлено: Igors от Январь 05, 2015, 09:08
правда, мне не очень при этом понравилось, что соседние цвета - они и по цвету соседние.
Тогда напр так
Код
C++ (Qt)
src.hue() + 256 / 16 * 5) % 256