2011-01-30 3 views
1

У меня есть корзина цветов, и я хочу, чтобы они пометили и отсортировали по их цвету. Любые идеи о том, как это можно сделать, будут очень полезными.Сортировка товаров по их цвету

Большое спасибо за ваше время.

+5

Мне нравится этот вопрос. рофлинг. Пожалуйста, предоставьте более подробную информацию. – andrewk

+1

@normalone: ​​Как вы представляете содержимое своей корзины? Что вы подразумеваете под «тегом»? "Сортировать"? Вы действительно имеете в виду «группу» вместо «сортировки»? Если нет, как вы заказываете цвета, которые обычно задаются 3-мя символами чисел, например. (красный, зеленый, синий)? Красный> синий или красный <синий? –

+0

@John Machin Если у вас есть значения rgb/hex, на самом деле очень легко сортировать цвета с одного конца спектра на другой. – Endophage

ответ

0

Если вы хотите отсортировать его по фактическому цвету, а не по алфавиту по названию цвета, то решение не очень очевидно. Сортировка обычно выполняется для объектов, где может быть определена четкая семантика «больше, чем» и «меньше». Цвета, тем не менее, не имеют такой семантики, потому что они представлены тремя цифрами в целом (либо RGB, либо HSV). Вам придется произвольно определить свой собственный «порядок», а затем отсортировать его.

+0

Это верно в некоторой степени. Но я готов поспорить, что у вас есть интуитивное представление о том, как выглядит набор «неупорядоченных» цветов по сравнению с набором «упорядоченных» цветов. Проблема заключается в том, как зафиксировать это в коде. –

+1

Моей первой мыслью был заказ по оттенку, как ответ Блинди. Но потом, когда я последовал этой мысли, я столкнулся со всеми проблемами. Что относительно цветов, которые сильно ненасыщены? Как бы вы сортировали <255,0,0> и <100,0,0>? Вы можете сортировать по оттенку, затем насыщаться, а затем ценить. Или красный, затем зеленый, затем синий. Вот что я получил в своем ответе. – Colin

5

Наиболее очевидно, что решение похоже на заказ.

Это даст вам стабильный сортировки оператор сравнения, который будет сортировать ваш массив в следующем порядке: enter image description here

Обратите внимание, что некоторые RGB цвета являются вырожденными в том смысле, что они не имеют единой формы HLS. Белый пример - такой пример. Это зависит от вас, как вы с ними справитесь.

+1

+1 для ответа на вопрос (несмотря на то, что он слепой?) –

+0

Добавьте также вертикальную шкалу для «насыщенности», если два цвета одинаковы. – poitroae

0

Вы можете сделать это, используя концепцию 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).

0

вы можете сравнить цвета в Java см this

+0

Это сравнение для равенства, а не для большего/меньшего. – poitroae

1

Вы можете попробовать принимать основные компоненты дисперсии, то проецирование на этой оси. (Так что, если все цвета являются оттенками красного, красный цвет отличен от нуля, зеленый и синий равны нулю, а алгоритм говорит, что ось равна 1,0, 0,0, 0,0. Затем она сортируется по красному. Если все оттенки желтый, то эта ось - корень (0.5), корень (0.5), 0.0, он усредняет красный и зеленый цвета и сортирует по этому). Это не сработает, если цвета образуют три или более отдельных «облака».

Смежные вопросы