У меня есть начало (x1, y1) и конец (x2, y2), а также их цвета, хранящиеся в RGBA.
Мне нужно нарисовать градиентную заполненную линию между этими двумя точками, и для каждой точки вдоль линии я могу получить текущие (x, y) позиции, так как они находятся в инкрементном цикле while.
Начальный и конечный цвет доступен как point1.color & point2.color.
Затем я рисую точку, используя DrawPoint (Vector (x, y)) и устанавливая цвет с помощью SetColor (RGBA), прежде чем он снова пройдет цикл.
Количество отдельных точек, которые ваш существующий код (который вы упомянули в своем вопросе) рисует для этой линии, должно быть:
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
компоненты.
Других решений пока нет …