Функция генерации цвета - PullRequest
3 голосов
/ 17 мая 2009

Давайте рассмотрим следующий сценарий: функция, которая может генерировать цвета кода от белого до красного, от белого до синего, от белого до розового, от белого до оранжевого и т. Д.

Код цвета в формате RGB со значениями от 0 до 255.

Есть идеи? Можете ли вы дать мне псевдокод или ссылку на такой алгоритм?

Ответы [ 5 ]

12 голосов
/ 17 мая 2009

Похоже, что вы после линейной интерполяции - в вашем случае, интерполяция от белого до указанного цвета. Например, в C #:

public IEnumerable<Color> Interpolate(Color from, Color to, int steps)
{
    int range = steps-1; // Makes things a bit easier
    for (int i=0; i < steps; i++)
    {
        // i is the proportion of the "to" colour to use.
        // j is the proportion of the "from" colour to use.

        int j = range - i;
        int r = ((from.R * j) + (to.R * i)) / range;
        int g = ((from.G * j) + (to.G * i)) / range;
        int b = ((from.B * j) + (to.B * i)) / range;
        yield return new Color(r, g, b);
    }
}

Конечно, есть и другие способы сделать это, кроме линейной интерполяции, но это, вероятно, будет самым простым. Обратите внимание, что это становится сложным, если у вас много шагов или больших значений, потому что вам нужно учитывать возможность переполнения. В этом случае вы должны быть в порядке - вам вряд ли понадобится более 256 шагов, а максимальное значение - 255, поэтому вы не приблизитесь к пределам int с.

РЕДАКТИРОВАТЬ: Как отмечено в комментариях, RGB, возможно, не является лучшей областью для использования линейной интерполяции. Возможно, вам лучше всего преобразовать значения from / to RGB в HSL или HSV и выполнить их интерполяцию. Это может быть легко или сложно в зависимости от вашей платформы. Ссылка на википедию в предыдущем предложении дает формулы для соответствующих вычислений, если они вам не предоставлены.

3 голосов
/ 17 мая 2009

Алгоритм:

  1. Найти значение RGB для белого
  2. Найти значение RGB для другого цвета (например, вы упомянули красный, синий, розовый, оранжевый)
  3. Рассчитать значения RGB, чьи компоненты RGB арифметически находятся между компонентами RGB двух экстремумов

Например, если один экстремум (0,0,0), а другой экстремум (0,255,255), то значение на полпути между этими двумя цветами равно (0,128,128) ... и это значение составляет одну четверть путь между этими двумя значениями составляет (0,64,64).

2 голосов
/ 19 мая 2009

Интерполяция цветов через известные конкретные точки часто используется для построения цветовых схем для построения графиков данных. Альтернативой явной интерполяционной формуле является выбор цветовой схемы, которая имеет некоторый дизайн за своим представлением. Хороший источник такой схемы - ColorBrewer .

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

1 голос
/ 17 мая 2009

Начните с двух цветов, между которыми вы хотите градиенты, и разделите их на части R, G и B.

Решите, сколько «шагов» вы хотите пройти.

Разделите разницу между частями R, G и B на количество шагов. Теперь у вас есть «разница шагов» для каждого цвета.

Переберите каждый шаг и добавьте разность шагов к значению цвета один раз для каждой итерации. Округлить до целых чисел последняя вещь, которую вы делаете.

0 голосов
/ 17 мая 2009

Какие цвета вы хотите изменить? От белого к красному - это случай с 255 255 255 и уменьшения двух вторых до 255 0 0. Синий будет сохранять последнее значение и уменьшаться до 0 0 255 и т. д.

...