То, что вы ищете, на самом деле не называется билинейной интерполяцией.Билинейная подразумевает двухмерную цветовую карту с использованием двух аргументов i и j в диапазоне 0-1 и смешивает четыре цвета с использованием этих двух значений i, j - т.е.
C = C_00 (1-i) (1-j) + C_10 * i * (1-j) + C_01 * (1-i) * j + C_11 * i * j
, где C_ij - угловые цвета.
Если я правильно вас понимаю, то вы действительно хотите иметь возможность создавать градиент, который включает в себя более одного цвета, но при этом остается одномерным, используя один параметр.Для этого существует множество методов.Простейшим из них является смешение от цвета A до цвета B в диапазоне от 0 до 0,5 и от B до C в диапазоне от 0,5 до 1,0.
Конечно, вы можете разделить на несколько цветов больше, чем просто 3 ...
Код для этого будет выглядеть примерно так:
private void InitColors( Color * colors, int n_colors)
{
int range = 255;
lookup = new Color[range];
int red;
int green;
int blue;
for (int i = 0; i < range; i++)
{
float f = float(i)/float(range);
//Work out which interval we're in
int interval = f*(n_colors);
//Special case for the end point to prevent out-of-bounds access.
if(f>=1.0) { interval = n_colors-1; }
//Work out how far into that interval we are
float ff = f * (n_colors-1) - interval;
int R = (colors[interval].R * (1-f) + colors[interval+1].R*f;
int G = (colors[interval].G * (1-f) + colors[interval+1].G*f;
int B = (colors[interval].B * (1-f) + colors[interval+1].B*f;
lookup[i] = Color.FromArgb(R, G, B);
}
}
Теперь есть параиз проблем с этим, которые вы, вероятно, не будете беспокоиться, но я упомяну на всякий случай:
Это не очень плавный переход цвета.Если вы хотите более плавного поведения, вам нужно использовать сплайн-подход (который технически является самой простой версией).Я бы посоветовал посмотреть на сплайны Каттмул-Рома для этого.
Цветовые переходы не очень однородны или хороши.Я бы посоветовал сделать вычисления в пространстве, отличном от RGB, и в конце преобразовать обратно в RGB.Для этого я бы рассмотрел Lab
пробел (HSV - другой вариант, но тогда вам нужно беспокоиться о переносе в направлении H.)
Надеюсь, это поможет.