Если бы Вы говорите о терминале, я использовал бы что-то как lib Проклятий, чтобы сделать это.
существует хороший модуль Проклятий для доступа к нему, который можно использовать как это:
perl -MCurses -e '$win=new Curses;$win->clear()'
Во-первых, вы запрашиваете линейную интерполяцию, но не указываете, что цвет B находится на линии между цветом A и цветом C; это необходимо. Во-вторых, вы не указали, но я сделаю упрощенное предположение, что цвет B является средней точкой линии между цветом A и цветом C; следующий код легко изменить, если это не так. Наконец, я изменил ваше предположение о том, что параметр представляет собой целое число от нуля до ста, чтобы оно было двойным от нуля до единицы. В последнем случае код легче написать и легче понять, и он все еще может использоваться с первым (разделите введенные вами данные на сто).
class ColorInterpolator {
delegate byte ComponentSelector(Color color);
static ComponentSelector _redSelector = color => color.R;
static ComponentSelector _greenSelector = color => color.G;
static ComponentSelector _blueSelector = color => color.B;
public static Color InterpolateBetween(
Color endPoint1,
Color endPoint2,
double lambda) {
if (lambda < 0 || lambda > 1) {
throw new ArgumentOutOfRangeException("lambda");
}
Color color = Color.FromRgb(
InterpolateComponent(endPoint1, endPoint2, lambda, _redSelector),
InterpolateComponent(endPoint1, endPoint2, lambda, _greenSelector),
InterpolateComponent(endPoint1, endPoint2, lambda, _blueSelector)
);
return color;
}
static byte InterpolateComponent(
Color endPoint1,
Color endPoint2,
double lambda,
ComponentSelector selector) {
return (byte)(selector(endPoint1)
+ (selector(endPoint2) - selector(endPoint1)) * lambda);
}
}
Как вы измените это, если цвет B не является средней точкой между цветами А и цвет С? Самый простой способ - следующий. Если параметр (то, что я называю " лямбда
" ) меньше 0,5
, умножьте лямбда
на два и верните интерполированный цвет между цветом A и цветом B. Если параметр больше 0,5
, умножьте лямбда
на два и вычитает единицу (это отображает [0.5, 1]
на [0, 1]
) и возвращает интерполированный цвет между цветом B и цветом C.
Если вам не нравится требование, чтобы цвет B находился на линии между цветом A и цветом C, вы можете использовать именно ту модификацию, которую я только что описал, для выполнения кусочно-линейной интерполяции между цветами.
Наконец, вы не указали, хотите ли вы интерполировать так называемое альфа-значение («A» в «ARGB»). Приведенный выше код легко изменить, чтобы справиться с этой ситуацией.