По сути, у вас есть исходное изображение и сетка.Сетка начинается как сетка с идеальными квадратами, но деформируется.Алгоритм:
For Each section of the mesh
For Each pixel of the section
(x, y) = Location in original photo for this pixel // (floating point)
color = ColorFromOriginal(x, y) // this needs to blend neighboring pixels if fractional
setColor(color)
. Выяснить (x, y) - простая геометрия - сопоставить центр деформированного квадрата с центром оригинала, а затем выяснить, в каком треугольнике вы находитесь (N,S, E, W) и сопоставьте деформированный треугольник с оригиналом.
+---------+
|\ /|
| \ N / |
| \ / |
| \ / |
| W X E |
| / \ |
| / \ |
| / S \ |
|/ \|
+---------+
Когда у вас есть (x, y) в плавающей точке, рассчитайте его цвет, смешав четыре пикселя, которые перекрывают этот плавающий pt,координата в соотношении перекрытия.
Целочисленные пиксели
+----+----+----+
| | | |
| | | |
+----+----+----+
| | | |
| | | |
+----+----+----+
| | | |
| | | |
+----+----+----+
Плавающая точка.наложенный на него пиксель
+----+----+----+
| | | |
| x|xx | |
+----+----+----+
| x|xx | |
| | | |
+----+----+----+
| | | |
| | | |
+----+----+----+
Результирующий цвет представляет собой смешение четырех пикселей в соотношении, насколько оно перекрывается.
Это в точности алгоритм изменения размера (повторной выборки) - сетка не деформируется, а просто увеличивается, поэтому шаг треугольника не нужен, но это та же идея.