Вопрос

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

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

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

Это было полезно?

Решение

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

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 или ВПГ, и делаем интерполяцию по ним.Это может быть легко или сложно в зависимости от вашей платформы.Ссылка на Википедию в предыдущем предложении дает формулы для соответствующих расчетов, если они вам не предоставлены.

Другие советы

Алгоритм:

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top