Что делает этот таинственный метод цвета? Что это возвращает? - PullRequest
1 голос
/ 26 февраля 2009

Может быть, у меня было слишком много кофе, может быть, я работал слишком долго, независимо от того, я в растерянности относительно того, что делает этот метод, или, скорее, почему и как он это делает, может кто-нибудь потерять свет на меня? Что такое следующий цвет?

public Color nextColor() {
   int max = 0, min = 1000000000, cr = 0, cg = 0, cb = 0;
   for (int r = 0; r < 256; r += 4) {
      for (int g = 0; g < 256; g += 4) {
         for (int b = 0; b < 256; b += 4) {
            if (r + g + b < 256 || r + g + b > 512) {
               continue;
            }
            min = 1000000000;
            for (Color c : colorTable) {
               int dred   = r - c.getRed();
               int dgreen = g - c.getGreen();
               int dblue  = b - c.getBlue();
               int dif = dred * dred + dgreen * dgreen + dblue * dblue;
               if (min > dif) {
                  min = dif;
               }
            }
            if (max < min) {
               max = min;
               cr  = r;
               cg  = g;
               cb  = b;
            }
         }
      }
   }

   return new Color(cr, cg, cb, 0x90);
}

UPDATE

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

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

Я не очень хорошо разбираюсь в цветовой шкале RGB. Знание намерения вышеупомянутого метода состоит в том, чтобы получить "бесплатный?" цвет к существующему набору цветов, будет ли решение, представленное в 1 , на самом деле бесплатным в том смысле, как мы воспринимаем цвет? Есть ли более простой способ выбрать цвет, который будет дополнять набор, или численный анализ компонентов RGB действительно даст соответствующий цвет?

Ответы [ 4 ]

3 голосов
/ 26 февраля 2009

Похоже, у вас есть таблица цветов, в которой хранится список цветов.

Тогда у вас есть странно жестко заданное цветовое пространство

Цвета с компонентами, которые являются кратный 4 и "не слишком яркий" но не "слишком темно".

Эта функция, кажется, дает вам цвет в последнем, который "контрастирует" лучше всего с вашей таблицей цветов.

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

1 голос
/ 26 февраля 2009

Учитывая глобальный массив объектов Color с именем colorTable, эта функция найдет цвет из следующего цветового пространства, ближайшего * к каждому в этом массиве, а затем один из тех цветов, который был дальше всего:

красный, зеленый, синий компоненты, кратные 4 Красный + Зеленый + Синий между 256 и 512

*: «ближайший» определяется как наименьшая сумма квадратов разности для каждого цветового компонента.

Как определил Пол, это выглядит правдоподобным, хотя и безумно неэффективно реализованным, наивным подходом к поиску одного цвета, который обеспечивает высокую контрастность с содержимым colorTable. Тот же результат может быть получен за один проход через colorTable и немного больше математики вместо примерно 5 миллионов проходов через colorTable, и есть гораздо лучшие способы найти другой цвет, который обеспечивает гораздо более высокий средний контраст.

0 голосов
/ 28 февраля 2009

Рассмотрим случай, когда псевдотвердое тело, определенное точками в colorTable, имеет большую "пустоту" внутри, так что nextColor выбирает точку в центре этой полости как nextColor. В зависимости от того, что вы знаете о colorTable, этот случай может быть чрезвычайно редким. Если прогнозируется, что он достаточно редок, и вы готовы принять менее чем оптимальное (если принять, что выход nextColor будет оптимальным) в этих случаях, тогда значительная оптимизация представляет себя.

Во всех случаях, кроме описанного выше, цвет, выбранный nextColor, будет где-то на поверхности минимальной выпуклой оболочки, охватывающей все точки в плотном цветовом пространстве 1/64, определенном вашими петлями. Генерация списка точек на этой поверхности немного сложнее в вычислительном отношении, чем простые циклы, которые генерируют список всех точек, но это уменьшило бы ваше пространство поиска примерно в 25 раз.

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

Если nextColor, выбранный из них, «слишком близок» к вашей colorTable, то вы можете использовать исходный тип поиска в надежде найти вид «пустоты», упомянутый выше. Плотность этого поиска может быть адаптирована в зависимости от того, насколько близок первый проход и сужен оттуда. То есть, если сверхбыстрый поиск обнаруживает следующий элемент ColorCal на расстоянии 8 единиц от его ближайшего соседа в colorTable, то для этого лучше всего найти пустоту, по крайней мере, 16 единиц в пределах colorTable. Запустите исходный поиск с шагом 8 и сохраните все кандидаты, удаленные более чем на 4 единицы (выемка вряд ли будет выровнена с вашей сеткой поиска), затем отцентрируйте поиск по радиусу-12 с более высокой плотностью на каждом из этих кандидатов.

Мне приходит в голову, что 1/64-плотная природа (все кратные 4) вашего пространства поиска была, вероятно, установлена ​​первоначальным автором с целью ускорения поиска в первую очередь. Учитывая эти улучшения, вы покончите с этим компромиссом.

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

0 голосов
/ 26 февраля 2009

Он пытается получить другой цвет для

a) ложное цветовое кодирование набора данных.

б) нарисовать еще одну линию на графике.

...