Цветная интерполяция между 3 раскрашивает.NET

Если бы Вы говорите о терминале, я использовал бы что-то как lib Проклятий, чтобы сделать это.

существует хороший модуль Проклятий для доступа к нему, который можно использовать как это:

perl -MCurses -e '$win=new Curses;$win->clear()'
7
задан Jon Seigel 10 April 2010 в 19:14
поделиться

1 ответ

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

15
ответ дан 6 December 2019 в 11:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: