Сортировка цветов с помощью Delta-E

#javascript #arrays #sorting

#javascript #массивы #сортировка

Вопрос:

Я хотел бы отсортировать набор цветов, чтобы я мог отображать их наиболее визуально приятным способом. Я понимаю, что это широкая тема, и то, что считается визуально приятным, открыто для обсуждения, поэтому я решил использовать алгоритм Delta-E. Я использую библиотеку JS под названием Delta-E.

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

Однако я не уверен, как выйти за рамки этого пункта. Как только у меня будут дельты для каждой пары цветов, как мне использовать эти значения для упорядочивания цветов?

Какую сортировку мне нужно использовать?

Ответ №1:

На самом деле я имею дело с той же проблемой прямо сейчас. Одно из решений, с которым я работаю, — это установить цвет привязки. Я имею в виду, что вы должны вызвать свою deltaE функцию с тем же цветом привязки, а затем с цветом, который вы хотите сравнить, который вернет значения разницы из того же цвета. Затем вы можете использовать это значение разницы в своем Array.sort() вызове:

 
const colors = ['#333333', '#f1f1f1', '#00aacc', '#ff6666', '#000000'];
const anchorColor = '#fff'; // White or black might be a decent choice of anchor color

colors.sort((colorA, colorB) => {
  // For each color, determine the color difference FROM the anchor color (not each other)
  const colorADelta = deltaE(anchorColor, colorA);
  const colorBDelta = deltaE(anchorColor, colorB);
  if (colorADelta > colorBDelta) {
    return 1;
  }
  if (colorADelta < colorBDelta) {
    return -1;
  }
  return 0;
});

  

Однако в моем личном тестировании я обнаружил, что deltaE значения разницы не совсем подходят для этой техники привязки, и вместо этого я использовал евклидово расстояние в качестве значения, из этой библиотеки (которая также имеет функцию Delta-E).