список встроенных цветов, сгруппированных по равенству цветов

#c# #colors #compareto

#c# #Цвет #сравнение

Вопрос:

Я хотел бы сравнить цвета, но понятия не имею, с чего начать. Я пытался

 private static int CompareColors(Color colorA, Color colorB)
{
    long resultA = colorA.A   colorA.B   colorA.G   colorA.R;
    long resultB = colorB.A   colorB.B   colorB.G   colorB.R;
    return (int)Math.Max(-1, Math.Min(1, resultA - resultB));
}
 

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

 private static int CompareColors(Color colorA, Color colorB)
{
    string resultA = colorA.Tostring();
    string resultB = colorB.Tostring();
    return string.Compare(resultA, resultB);
}
 

который, кажется, дает несколько лучшие результаты, но все же время от времени перемежается странно неуместным ярким цветом (особенно в области цветов «мягче» / «меньшее значение»). (как) я могу улучшить этот последний результат?

РЕДАКТИРОВАТЬ: спасибо за все комментарии, теперь я понимаю, что для этого вопроса может потребоваться дополнительная информация, чтобы вы могли давать значимые ответы, поэтому я уточню и надеюсь, что вы все еще согласны со мной в ответе на этот вопрос. это моя цель: представьте себе цветовую палитру, подобную этой, я бы хотел представить это в отсортированном списке. конечно, цветовая палитра — 2D, а мой список — 1D, но я работаю только со встроенными цветами, которые я просматриваю следующим образом

 List<Color> colors = new List<Color>();
Type colorType = typeof(Colors);
foreach (PropertyInfo propertyInfo in colorType.GetProperties(BindingFlags.Public | BindingFlags.Static))
{
    if (propertyInfo.PropertyType == typeof(Color))
    {
        colors.Add((Color)propertyInfo.GetValue(null, null));
    }
}
colors.Sort(new Comparison<Color>((colorA, colorB) => CompareColors(colorA, colorB)));
 

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

для ясности: под «равенством цветов» и «цветовыми группами» я имею в виду визуально согласованные цветовые области в цветовой палитре образца. под «плавными переходами» я имею в виду области в цветовой палитре между визуально согласованными цветовыми областями. Я не работаю с огромным разнообразием цветов, таких как функции цветовой палитры sample, я работаю только со встроенными цветами (которые, по-видимому, содержат большое количество кремовых цветов).

Комментарии:

1. Не могли бы вы начать с малейшего намека на то, что, черт возьми, вы пытаетесь сделать? (Точнее, как вы хотите определить свой полный или частичный заказ?)

2. Другой способ думать об этом — представить цвет в виде трехмерной координаты. Разница между 2 цветами будет равна расстоянию между 2 точками в 3D-пространстве.

3. Какое у вас определение для сравнения? Является ли один цвет «меньше» другого цвета, если он ближе к черному?

4. Вам «интересно, почему нет такого понятия, как compareTo», и все же вы «понятия не имеете, с чего начать?» Это имеет смысл.

5. Если вы хотите выполнить сортировку по яркости, вам следует преобразовать каждый цвет в его представление HSL / HSV и использовать компонент L / V в качестве основы для сравнения (при необходимости возвращаясь к S, а затем H).)

Ответ №1:

Если вам нужна произвольная сортировка, вы можете реализовать ее любым способом. Например:

 private static int CompareColors(Color colorA, Color colorB)
{
  if (colorA.A > colorB.A)
    return 1;
  if (colorA.A < colorB.A)
    return -1;

  if (colorA.R > colorB.R)
    return 1;
  if (colorA.R < colorB.R)
    return -1;

  if (colorA.G > colorB.G)
    return 1;
  if (colorA.G < colorB.G)
    return -1;

  if (colorA.B > colorB.B)
    return 1;
  if (colorA.B < colorB.B)
    return -1;

  return 0;
}
 

Комментарии:

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