Как рассчитать четырехцветный градиент? - PullRequest
14 голосов
/ 10 июля 2009

Если у меня есть четыре цвета (A, B, C & D) на четырех углах квадрата, и я хочу заполнить этот квадрат градиентом, который хорошо сочетается между четырьмя цветами, как бы я рассчитал цвет точки E

Чем ближе E к любой другой точке, тем сильнее этот цвет должен влиять на результат.

Есть идеи, как это сделать? Скорость и простота предпочтительнее точности.

цвета http://rabien.com/image/colours.png

Ответы [ 3 ]

23 голосов
/ 10 июля 2009

Наилучшим решением, когда требуется градиент между двумя цветами, является использование представления HSV (значение насыщенности оттенка).

Если у вас есть значения HSV для ваших двух цветов, вы просто делаете линейную интерполяцию для H, S и V, и у вас есть хорошие цвета (интерполяция в пространстве RGB всегда приводит к «плохим» результатам).

Вы также найдете здесь формулы для перехода от RGB к HSV и от HSV к RGB соответственно.

Теперь, для вашей проблемы с четырьмя углами, вы можете сделать линейную комбинацию четырех значений H / S / V, взвешенных по расстоянию от E до этих четырех точек A, B, C и D.

РЕДАКТИРОВАТЬ: тот же метод, что и tekBlues, но в пространстве HSV (его довольно просто проверить в RGB и в пространствах HSV. И вы увидите различия. В HSV вы просто поворачиваете хроматический цилиндр, почему это дает хороший результат)

EDIT2: если вы предпочитаете «скорость и простоту», вы можете использовать L1-норму вместо L2-нормы (евклидова норма)

Итак, если a - это размер вашего квадрата, а координаты ваших точек A (0, 0), B (0, a), C (a, 0), D (a, a), затем оттенок точки E (x, y) можно вычислить с помощью:

Hue(E) = ( Hue(B)*y/a + Hue(A)*(1-y/a) ) * (x/a)  +  ( Hue(D)*y/a + Hue(C)*(1-y/a) ) * (1-x/a)

, где Hue(A) - это оттенок точки A, Hue(B) - оттенок B и т. Д. *

Вы применяете те же формулы для насыщенности и значения.

Как только у вас есть оттенок / насыщенность / значение для вашей точки E, вы можете преобразовать ее в пространство RGB.

2 голосов
/ 07 сентября 2012

Посетите этот сайт, на котором представлена ​​демонстрация комментария @ ThibThib о том, что «градиенты в HSV будут более удовлетворительными»:

http://www.perbang.dk/rgbgradient/

Это создатель градиента, который создаст и покажет ОБА градиент RGB и градиент HSV.

Если вы попробуете 9 шагов от FFAAAA до AAFFAA (от красного до зеленого), вы получите хороший переход через светло-желтый, а HSV и RGB выглядят одинаково.

Но попробуйте 9 шагов от FF0000 до 00FF00 (жирный красный на зеленый), и вы увидите переход RGB one через грубоватый зеленовато-коричневый. Градиент ВПГ, однако, переходит в жирный желтый.

1 голос
/ 10 июля 2009
  1. Определите расстояние от точки E до каждой точки A, B, C, D
  2. Цвет для точки E будет сочетанием красного / зеленого / синего. Рассчитайте каждую цветовую ось как среднее значение для той же цветовой оси для A, B, C, D с подъемом по расстоянию.

    distance_a = sqrt ((xa-xe) ^ 2 + (ya-ye) ^ 2)

    distance_b = ....

    sum_distances = distance_a + distance_b ...

    red = (red_a distance_a + red_b distance_b ...) / sum_distances

    color_E = ColorFromARgb (красный, зеленый, синий)

...