#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. спасибо, но, похоже, это дает те же результаты, что и метод сравнения строк