У меня есть корзина цветов, и я хочу, чтобы они пометили и отсортировали по их цвету. Любые идеи о том, как это можно сделать, будут очень полезными.Сортировка товаров по их цвету
Большое спасибо за ваше время.
У меня есть корзина цветов, и я хочу, чтобы они пометили и отсортировали по их цвету. Любые идеи о том, как это можно сделать, будут очень полезными.Сортировка товаров по их цвету
Большое спасибо за ваше время.
Если вы хотите отсортировать его по фактическому цвету, а не по алфавиту по названию цвета, то решение не очень очевидно. Сортировка обычно выполняется для объектов, где может быть определена четкая семантика «больше, чем» и «меньше». Цвета, тем не менее, не имеют такой семантики, потому что они представлены тремя цифрами в целом (либо RGB, либо HSV). Вам придется произвольно определить свой собственный «порядок», а затем отсортировать его.
Это верно в некоторой степени. Но я готов поспорить, что у вас есть интуитивное представление о том, как выглядит набор «неупорядоченных» цветов по сравнению с набором «упорядоченных» цветов. Проблема заключается в том, как зафиксировать это в коде. –
Моей первой мыслью был заказ по оттенку, как ответ Блинди. Но потом, когда я последовал этой мысли, я столкнулся со всеми проблемами. Что относительно цветов, которые сильно ненасыщены? Как бы вы сортировали <255,0,0> и <100,0,0>? Вы можете сортировать по оттенку, затем насыщаться, а затем ценить. Или красный, затем зеленый, затем синий. Вот что я получил в своем ответе. – Colin
Наиболее очевидно, что решение похоже на заказ.
Это даст вам стабильный сортировки оператор сравнения, который будет сортировать ваш массив в следующем порядке:
Обратите внимание, что некоторые RGB цвета являются вырожденными в том смысле, что они не имеют единой формы HLS. Белый пример - такой пример. Это зависит от вас, как вы с ними справитесь.
+1 для ответа на вопрос (несмотря на то, что он слепой?) –
Добавьте также вертикальную шкалу для «насыщенности», если два цвета одинаковы. – poitroae
Вы можете сделать это, используя концепцию Lexicographic ordering.
В принципе, учитывая HSL представления 2-х цветов (скажем C1 = (H1, S1, L1)
и C2 = (H2, S2, L2)
), мы можем определить C1 < C2
тогда и только тогда, когда ((H1 < H2) || (H1 == H2 && S1 < S2) || (H1 == H2 && S1 == S2 && L1 < L2))
, и C1 == C2
тогда и только тогда, когда H1 == H2 && S1 == S2 && L1 == L2
. Аналогично для C1>C2
.
Это будет заказ цветов сначала по оттенку; затем путем насыщения для разрешения конфликтов оттенков; и, наконец, легкостью разрешать конфликты оттенков и насыщенности.
В этом примере я использовал порядок приоритета H > S > L
, но вы могли бы легко использовать какой-либо другой порядок в соответствии с вашими потребностями или, возможно, даже другое повторное представление цвета (например, RGB).
Вы можете попробовать принимать основные компоненты дисперсии, то проецирование на этой оси. (Так что, если все цвета являются оттенками красного, красный цвет отличен от нуля, зеленый и синий равны нулю, а алгоритм говорит, что ось равна 1,0, 0,0, 0,0. Затем она сортируется по красному. Если все оттенки желтый, то эта ось - корень (0.5), корень (0.5), 0.0, он усредняет красный и зеленый цвета и сортирует по этому). Это не сработает, если цвета образуют три или более отдельных «облака».
Мне нравится этот вопрос. рофлинг. Пожалуйста, предоставьте более подробную информацию. – andrewk
@normalone: Как вы представляете содержимое своей корзины? Что вы подразумеваете под «тегом»? "Сортировать"? Вы действительно имеете в виду «группу» вместо «сортировки»? Если нет, как вы заказываете цвета, которые обычно задаются 3-мя символами чисел, например. (красный, зеленый, синий)? Красный> синий или красный <синий? –
@John Machin Если у вас есть значения rgb/hex, на самом деле очень легко сортировать цвета с одного конца спектра на другой. – Endophage