Сортировать System.Media.Colors в соответствии с положением в видимом спектре - PullRequest
8 голосов
/ 25 марта 2011

Какой самый быстрый / простой способ сортировки цветов в System.Media.Colors в соответствии с его положением в видимом спектре (красный на синий или синий на красный не имеет значения)?

РЕДАКТИРОВАТЬ:

Вот результат сортировки (оттенок> насыщенность-> яркость):

enter image description here

Это, вероятно, технически правильно, но визуально это не так,Может кто-то пролить свет на то, в чем проблема?

Ответы [ 2 ]

4 голосов
/ 25 марта 2011

Кажется, вы хотите отсортировать цвета по оттенку. Для этого вам нужно вычислить оттенок цвета, а структура Wpf System.Media.Color не содержит свойств, которые могут сделать это за вас.

У вас есть два варианта:

  • Вы можете вручную вычислить оттенок. Это не очень сложно, но это грязно: много утверждений «если тогда». Пример кода, делающего это , можно найти на devx . Это более трудоемкий и менее читаемый, но, вероятно, более быстрый вариант.
  • Вы можете использовать System.Drawing.Color.GetHue. Более старая цветовая структура System.Drawing эпохи Winforms поддерживает вычисление оттенка. Это делает код действительно простым; Достаточно что-то вроде System.Drawing.Color.FromArgb(col.R, col.G, col.B).GetHue() - красиво и коротко! Однако это означает, что вы будете иметь дело с двумя структурами с одинаковыми именами, и вам, конечно, понадобится ссылка на сборку System.Drawing.dll. Такие методы, как правило, медленные и выполняют много проверок работоспособности, поэтому, если производительность критична, она, вероятно, будет менее привлекательной.

Цветовое пространство трехмерное. Хотя вы можете сортировать вдоль одного направления (например, оттенка, здесь), результирующая последовательность цветов будет выглядеть непрерывной, только если вы оставите два других направления (насыщенность и яркость в модели HSB) постоянными. Вот почему большинство палитр цветов выбирают двухмерное представление, но даже в этом случае вы должны оставить одно измерение константным в палитре цветов, чтобы поддерживать непрерывный градиент.

0 голосов
/ 22 февраля 2019

NVM упомянул моно как возможное решение, это не так. Проблема в современной технологии отображения. Моно подчеркивает эту проблему. Что отлично смотрится в цвете, моно рассеивается и наоборот. Это не значит, что это невозможно. Это можно сделать только математически.

Делая сортировку еще сложнее, мы все дальтоники, и эта слепота сильно различается у каждого человека. Математика выберет правильную сортировку, но никто не может предсказать, что увидит каждый из нас.

Спектр ≡ Тон ≈ Оттенок (((≡ зрительная кора, ≈ эндокринная компенсация)))

Синий ›› rgb (0, 0, 255) ›› nCol B0, 0%, 0%

Ncol an, w%, b% ›› a | (n + (((w + b) / 2) / cos ((w + b) / 2)

a | ((n + 1.w%) - (n + 1.b%)) / cos (wb) ... и это расширение nCol для RGB делает идеальную сортировку, один за другим, тьфу !

...