Ответ 1
Лучшим решением, когда требуется градиент между двумя цветами, является использование представления HSV (значение насыщенности оттенка).
Если у вас есть значения HSV для двух цветов, вы просто делаете линейную интерполяцию для H, S и V, и у вас хорошие цвета (интерполяция в пространстве RGB всегда приводит к "плохим" результатам).
Вы также можете найти здесь, чтобы перейти от RGB к HSV и от HSV к RGB соответственно.
Теперь, для вашей проблемы с четырьмя углами, вы можете сделать линейную комбинацию четырех значений H/S/V, взвешенных по расстоянию от E до четырех точек A, B, C и D.
EDIT: тот же метод, что и 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 и т.д.
Вы применяете те же формулы для насыщенности и значения.
Как только у вас есть значение Hue/Saturation/Value для вашей точки E, вы можете преобразовать его в пространстве RGB.