Алгоритм подбора цветов секторов круговой диаграммы

Различные алгоритмы, связанные с выводом графики.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 2982
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Москва

Алгоритм подбора цветов секторов круговой диаграммы

Сообщение jangle » 05.03.2012 (Пн) 18:01

Есть круговая диаграмма, в которой возможно 10-20 элементов, как раскрасить ее так, чтобы не было совпадение цветов у ближайших элементов? И они были максимально контрастными по отношению к соседям.
Сейчас распределяю цвета рандомно, что совсем неправильно, иногда цвет легенды у разных элементов совпадает. Нужен какой-то алгоритм, чтобы создаваемые цвета были максимально контрастными по отношению к соседям.
Вложения
Chart.png

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: Распределение окраски на круговой диаграмме

Сообщение Alec » 05.03.2012 (Пн) 19:28

А если задавать тон в цветовой модели HSV? Например, для 10 элементов задаем тоны 0, 0.1, 0.2 и т.д., а выводим в последовательности 0, 0.5, 0.2, 0.7 и т.д.
Иногда лучше вовремя остановиться...
И начать заново!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14109
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Распределение окраски на круговой диаграмме

Сообщение alibek » 05.03.2012 (Пн) 20:04

20 цветов можно просто таблицей задать.
Lasciate ogni speranza, voi ch'entrate.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 05.03.2012 (Пн) 20:07

Вариант 1: Заранее подобрать цвета.
Вариант 2: Рассматривая цвет как Long брать I * (&H01000000 \ ColrorCount), где ColorCount - некоторая заранее подобранная константа. Насколько я помню, можно выбрать что-то типа типа 1023, 31, 17 (может поподбирать придётся).

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 155
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Распределение окраски на круговой диаграмме

Сообщение Sam777e » 05.03.2012 (Пн) 22:14

alibek писал(а):20 цветов можно просто таблицей задать.


+1
Здоровья и удачи

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 2982
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Москва

Re: Распределение окраски на круговой диаграмме

Сообщение jangle » 05.03.2012 (Пн) 22:17

alibek писал(а):20 цветов можно просто таблицей задать.


Пока 20 разделов, в последствии их может быть больше. В принципе это количество не ограниченно.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16118
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Распределение окраски на круговой диаграмме

Сообщение Хакер » 06.03.2012 (Вт) 5:53

Берёшь любую радугу, которая достаточно плавная, и у которой один конец предельно близок к другому, например как здесь:
rainbow_wnd.png
rainbow_wnd.png (6.47 Кб) Просмотров: 9268


Берём полоску с радугой:
rainbow_bar.png
rainbow_bar.png (485 байт) Просмотров: 9268


Склеиваем края этой полоски, так, чтобы получилось кольцо:
ring_from_bar.png


Если вывернуть изначальный пример, получается что-то такое:
warped_ring_sample.png
warped_ring_sample.png (20.22 Кб) Просмотров: 9268


У такой окружности есть важное свойство: любой проведённый диаметр соединят пару точек с противоположенными цветами, а любые две равные хорды, проведённые две точки — пару точек «равноудалённых» по оттенку от заданной.

Теперь к делу: нам нужно выбрать цвета для N-секторной диаграммы. Для примера: нам нужно выбрать цвета для 5-секторной диаграммы.

Мы просто строим пятиконечную звезду внутри нашего кольца:
penta_ring.png
penta_ring.png (32.07 Кб) Просмотров: 9268


Всё, 5 цветов есть. Цвета нужно брать в направлении обхода звезды, то есть: красный→зелёный→фиолетовый→лайм→лазурный.

Способов построени N-угольников (включая самопересекающиеся) существуют целые семейства:
Изображение

Нужно брать зелёные звёзды — это т.н. связные звёзды.

Разумеется, что в реальности ничего не нужно строить: кольцо расчитывается математический, координаты точек расчитываются математически.

В итоге получение цвета — чисто по формуле.

Пример:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14109
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Распределение окраски на круговой диаграмме

Сообщение alibek » 06.03.2012 (Вт) 8:48

jangle писал(а):Пока 20 разделов, в последствии их может быть больше. В принципе это количество не ограниченно.

Тогда по HSV-модели, как советовали в первом ответе. Только в этом уже мало смысла, цвета будут сливаться и глаз будет их путать.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16118
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Хакер » 06.03.2012 (Вт) 8:57

Если идти по звезде, то сливаться не будут, наоборот, будут пестрить.
Другое дело, что легенду, основанную на сопоставлении цветов легенды с цветами секторов — уже не сделать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14109
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение alibek » 06.03.2012 (Вт) 9:23

Хакер писал(а):Если идти по звезде, то сливаться не будут, наоборот, будут пестрить.
Другое дело, что легенду, основанную на сопоставлении цветов легенды с цветами секторов — уже не сделать.

Я имел ввиду под "сливаться" именно это, глаз не сможет однозначно определить соответствие цвета легенде.
Если идти не по звезде, а просто по HSV-окружности с определенным шагом (n/1 в твоей диаграмме), тогда сопоставлять цвета легенде будет проще, но тогда наглядность пострадает.
Lasciate ogni speranza, voi ch'entrate.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 2982
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Москва

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение jangle » 06.03.2012 (Вт) 9:50

Берёшь любую радугу, которая достаточно плавная, и у которой один конец предельно близок к другому, например как здесь:


Хакер спасибо! Очень интересный алгоритм, буду пробовать его реализовать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16118
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Хакер » 06.03.2012 (Вт) 9:51

Я реализовал, но исходник утрачен — пропало напряжение на полсекунды.
Там строк 80 кода.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2855
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Proxy » 06.03.2012 (Вт) 10:22

Alec писал(а):А если задавать тон в цветовой модели HSV? Например, для 10 элементов задаем тоны 0, 0.1, 0.2 и т.д., а выводим в последовательности 0, 0.5, 0.2, 0.7 и т.д.

Хакер писал(а):Разумеется, что в реальности ничего не нужно строить: кольцо расчитывается математический, координаты точек расчитываются математически.


2 идентичных варианта, в первом лишь шаг неудачный (помимо шага в варианте Хакера всё аналогично, тоже работа с тоном (Hue), значит помимо шага сам математически "круг" выразить очень просто из системы уравнений HSV -> RGB).
И я вижу недочёт при большом количестве секторов: если у кого-то возникнет желание сопоставить сектора с легендой, то он сядет на сопоставлении оттенков синего (физиология, оттенки синего человек различает хуже всего). ИМХО можно заведомо выбирать на несколько процентов больше цветов, а затем отбрасывать слишком близко расположенные оттенки синего. При таком шаге это не скажется на различимости двух соседних секторов. Так можно будет сохранить читаемость при большей плотности (выноски едва ли помогут, они вообще перекроются, если сектора будут маленькими и их придётся при перекрытии вообще скрывать).
Последний раз редактировалось Anonymous 06.03.2012 (Вт) 10:27, всего редактировалось 1 раз.
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16118
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Хакер » 06.03.2012 (Вт) 10:26

Мой вариант предполагает в частности выбор произвольной радуги. То есть необязательно прогон Hue от 0° до 360°, хотя лично я реализовывал именно этот вариант. Но радугу можно выбирать такой, что разные оттенки будут иметь разные SB-составляющие, плюс можно сделать немонотонный dH/dx.

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

Но вообще да, идея та же, не спорю.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2855
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Proxy » 06.03.2012 (Вт) 10:31

Хакер писал(а):Ну и плюс шаг выбирается не от-балды, а по закономерности (причём вариантов закономерности — вон сколько).

А где я сказал про шаг от балды? :) Шаг лучше и не придумать.
Хакер писал(а):Мой вариант предполагает в частности выбор произвольной радуги.

Не знал. В любом случае с составлением "умной" радуги + шагом по звезде будет не проще, чем с использованием готовой радуги Hue из HSV (при прочих константах), шага по звезде, а затем отбросом лишних цветов. А лучше было бы и вовсе добавить зависимость смещения от целевого угла и красиво и равномерно "разуплотнить" кольцо к Юго-Западу.
Follow the white rabbit.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14109
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение alibek » 06.03.2012 (Вт) 11:41

Proxy писал(а):В любом случае с составлением "умной" радуги + шагом по звезде будет не проще, чем с использованием готовой радуги Hue из HSV (при прочих константах), шага по звезде, а затем отбросом лишних цветов.

Это по сути одно и то же. Просто Хакер визуализировал алгоритм выбора оптимального шага.
Lasciate ogni speranza, voi ch'entrate.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2855
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Proxy » 06.03.2012 (Вт) 13:58

Извиняюсь заранее за оффтоп, но как тут найти угол между вершиной A звезды, центром описанной окружности и вершиной B, смежной с вершиной A? Ака выше "шаг".

Хакер писал(а):Там строк 80 кода.

Полагаю поиск этого угла занял порядка 40 строк?

UPD. Кажется придумал
Последний раз редактировалось Anonymous 06.03.2012 (Вт) 14:03, всего редактировалось 1 раз.
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16118
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Хакер » 06.03.2012 (Вт) 14:01

На картинке написано. {m/n}
n — кол-во вершин.
m — константа, определяющая способ построение.

Дробь {m/n} определяет, на сколько частей делить окружность. Иначе говоря: 360 / (m/n) = угол.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2855
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Proxy » 06.03.2012 (Вт) 14:12

Без разуплотнения синего:

Печатает 5, а затем 8 цифр разных цветов с "шагом" "по звезде"
Код: Выделить всё
Option Explicit

Private Sub Form_Load()
AutoRedraw = True
PrintCols 5
PrintCols 8
End Sub

Private Sub PrintCols(totalCols As Long) 'печатает цифры уникальных цветов
Dim i As Long
Dim lastCornerAngle As Single
Dim AngleStep As Single
lastCornerAngle = 0
AngleStep = 180 - IIf(totalCols Mod 2 = 0, 1, 0.5) * (360 / totalCols)
For i = 1 To totalCols
  lastCornerAngle = lastCornerAngle + AngleStep
  Form1.ForeColor = HSV2RGBeasy(lastCornerAngle, 1, 1)
  Print i
Next
End Sub

Private Function HSV2RGBeasy(Hue As Single, Saturation As Single, ValueBr As Single) As Long 'просто получает RGB из HSV
Dim f As Single, p As Single, q As Single, t As Single
f = (Hue / 60) - (Hue \ 60)
p = (ValueBr * (1 - Saturation)) * 255
q = (ValueBr * (1 - f * Saturation)) * 255
t = (ValueBr * (1 - (1 - f) * Saturation)) * 255
f = f * 255: ValueBr = ValueBr * 255
Select Case ((Hue \ 60) Mod 6)
  Case 0
   HSV2RGBeasy = RGB(ValueBr, t, p)
  Case 1
   HSV2RGBeasy = RGB(q, ValueBr, p)
  Case 2
   HSV2RGBeasy = RGB(p, ValueBr, t)
  Case 3
   HSV2RGBeasy = RGB(p, q, ValueBr)
  Case 4
   HSV2RGBeasy = RGB(t, p, ValueBr)
  Case 5
   HSV2RGBeasy = RGB(ValueBr, p, q)
End Select
End Function


Можно просто вместо печати циферок помещать в массив цвета, чтобы потом использовать. Число уникальных цветов назначается через параметр процедуры PrintCols
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16118
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Хакер » 06.03.2012 (Вт) 14:54

Нда.
Стоило ли писать гигантскую функцию HSV2RGBeasy, принимающую 3 параметра, чтобы потом при вызове в качестве двух последних всегда указывать 1 и 1?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2855
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Proxy » 06.03.2012 (Вт) 16:19

Хакер писал(а):Нда.
Стоило ли писать гигантскую функцию HSV2RGBeasy, принимающую 3 параметра, чтобы потом при вызове в качестве двух последних всегда указывать 1 и 1?

На перспективу, может насыщенность иная потребуется или ещё что.
Follow the white rabbit.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3832
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Mikle » 06.03.2012 (Вт) 18:29

Можно представить диапазон доступных цветов, как RGB куб, точнее параллелепипед, коэффициенты "заметности" RGB компонентов давно известны: R=77, G=150, B=28. Делаем параллелепипед с такими сторонами, первый цвет берём случайный, каждый следующий - точка, максимально удалённая от уже занятых.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2855
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Proxy » 06.03.2012 (Вт) 19:18

Mikle писал(а):первый цвет берём случайный, каждый следующий - точка, максимально удалённая от уже занятых.

В такой формулировке первой точкой будет произвольная, второй вершина, третей противоположная вершина, четвёртой опять первая вершина и т.д. Или же я что-то неправильно понял.
Follow the white rabbit.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3832
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Mikle » 06.03.2012 (Вт) 19:24

Вторая-третья - точно вершины, а дальше - зависит от первой точки.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Antonariy » 07.03.2012 (Ср) 12:31

jangle писал(а):
Берёшь любую радугу, которая достаточно плавная, и у которой один конец предельно близок к другому, например как здесь:


Хакер спасибо! Очень интересный алгоритм, буду пробовать его реализовать.
Дальтоники в пролете с этим алгоритмом.
Наверно поэтому в MS цветовые схемы для винды создают вручную.
Вложения
star.jpg
star.jpg (39.27 Кб) Просмотров: 9173
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16118
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Хакер » 07.03.2012 (Ср) 12:33

Дальтоники в пролёте с любым алгоритмом, если у них расстройство восприятие такое, что цветов нет вообще.
Если же расстройство такое, что есть частичное нарушение восприятия, то это решается подбором соответствующей радуги.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Antonariy » 07.03.2012 (Ср) 12:44

Значит нужно предоставить на выбор несколько радуг. Или как-то ее параметризировать. Даже человеку с нормальным зрением может выпасть неудобная комбинация.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16118
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Хакер » 07.03.2012 (Ср) 13:10

Пример с человеком с нормальным зрением и неудачной комбинацией, выбранной по «звёздному» методу?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2855
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Proxy » 07.03.2012 (Ср) 13:59

Antonariy писал(а):Значит нужно предоставить на выбор несколько радуг. Или как-то ее параметризировать. Даже человеку с нормальным зрением может выпасть неудобная комбинация.
Antonariy писал(а):Дальтоники в пролете с этим алгоритмом.


48 элементов. Звезда работает как надо. Единственное чуть-чуть увеличить угол между оттенками синего (всего 1 функция потребуется, у которой параметром оригинальный угол, а выводит скорректированный), а в плане дальтонизма едва ли лучше может получиться при таком количестве элементов. Можно для них по контрасту добавить коррекцию, чтобы вся "гамма" серого использовалась (впрочем даже попробую...).
Вложения
36 1.png
36 2.png
Follow the white rabbit.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Алгоритм подбора цветов секторов круговой диаграммы

Сообщение Antonariy » 07.03.2012 (Ср) 14:14

Хакер писал(а):Пример с человеком с нормальным зрением и неудачной комбинацией, выбранной по «звёздному» методу?
Мне не нравится 19-23 и 43-45 со скриншота Proxy. Но в целом результат достойный.
Лучший способ понять что-то самому — объяснить это другому.

След.

Вернуться в Графика

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList