Как я могу линейно интерполировать цвет линии, если у меня есть начальная и конечная точки и цвет?

У меня есть начало (x1, y1) и конец (x2, y2), а также их цвета, хранящиеся в RGBA.

Мне нужно нарисовать градиентную заполненную линию между этими двумя точками, и для каждой точки вдоль линии я могу получить текущие (x, y) позиции, так как они находятся в инкрементном цикле while.

Начальный и конечный цвет доступен как point1.color & point2.color.

Затем я рисую точку, используя DrawPoint (Vector (x, y)) и устанавливая цвет с помощью SetColor (RGBA), прежде чем он снова пройдет цикл.

0

Решение

Количество отдельных точек, которые ваш существующий код (который вы упомянули в своем вопросе) рисует для этой линии, должно быть:

l=max(abs(x2-x1), abs(y2-y1))+1

То есть, если линия в основном ориентирована вертикально, в каждом ряду должна быть точка. Если он в основном ориентирован горизонтально, в каждом столбце должна быть точка. Таким образом, мы можем получить общее количество нарисованных отдельных точек, l, как просто максимальная разница между начальной и конечной координатами x / y. Это то, что должен делать ваш существующий код.

Итак, вы заранее знаете, что собираетесь рисовать l точки. Теперь это становится простой линейной интерполяцией между каждым человеком r, g, b а также a составная часть. Если «R1» является компонентом R в (x1, y1), а «R2» является компонентом R в (x2, y2): тогда при рисовании iТочка, с i начиная с 0 для (x1, y1) и достигая l в точке (x2, y2) линейно интерполированный R просто:

R1+i/l*(R2-R1)

Так когда i=0 это R1, и когда i=l это R2. Вы должны вычислить эту линейную интерполяцию: либо с использованием математики с плавающей точкой; или выполнив сначала целочисленное умножение, затем целочисленное деление (при условии, что ваша целочисленная точность достаточна, чтобы избежать переполнения во время умножения).

Вспенить, промыть и повторить тот же процесс для G, B, а также A компоненты.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]