Это ужасное объяснение, которое вы нашли. Надеюсь, я смогу помочь вам понять, что происходит под капотом.
То, что вы хотите сделать, это отобразить прямоугольную область (один четырехугольник) в другой (произвольной формы) четырехугольник. Давайте начнем с более простого случая: линейная интерполяция (поиск значений, которые лежат вдоль линии )
Если у вас есть линия от a до b, то вы можете найти любую точку 'c' на этой линии, используя это уравнение:
c = ((1 - p) * a) + (p * b);
Это 'смешивает' (интерполирует) значения двух позиций вдоль прямой линии между ними (линейно). Если вы используете p = 0, тогда уравнение превращается в
c = (1 * a) + (0 * b) = a
поэтому при p = 0 уравнение дает вам точку «a».
Когда p = 1, уравнение становится:
c = (0 * a) + (1 * b) = b
поэтому при p = 1 уравнение дает вам точку «b».
При промежуточных значениях p вы получаете точки на линии между a и b. (таким образом, при p = 0,5 вы получаете точку точно посередине между a и b)
Таким образом, чтобы скопировать пиксели из одной строки на экране в другую строку на экране, мы можем использовать линейную интерполяцию, чтобы найти позиции на строках для чтения и записи.
for (float p = 0.0; p <= 1.0; p += 0.1) // copy 10 pixels from line 1 to line 2
DrawPixelOnLine2(p, GetPixelFromLine1(p));
Эти два метода будут использовать линейную интерполяцию для вычисления правильных положений для чтения и рисования пикселей, например:
int ax = 0, ay = 100, bx = 50, by = 170; // line a-b goes from (0,100) to (50,170)
int px = ((1-p) * ax) + (p * bx); // calc the x and y values separately
int py = ((1-p) * ay) + (p * by);
(Обратите внимание, что мне нужно использовать вычисления дважды, чтобы сделать 2D-позицию. Я мог бы интерполировать в 3D, просто добавив тот же самый agaian вычисления для координат z / bz / pz)
Итак, теперь вы можете копировать точки с одной произвольной прямой на другую.
билинейная интерполяция точно такая же, за исключением того, что мы хотим найти точку внутри прямоугольника, а не внутри линии, поэтому нам нужно два измерения, чтобы описать, где точка находится в прямоугольнике (px вдоль нижней части прямоугольника и до стороны прямоугольника). Теперь вы можете найти любую точку в прямоугольнике с помощью (px, py) координатной пары.
Чтобы выполнить приведенное выше отображение, мы просто выполняем вычисление линейной интерполяции в двух измерениях: сначала мы интерполируем вдоль дна и вдоль вершины, чтобы найти две конечные точки линии, которая проходит вертикально через середину прямоугольника. затем мы интерполируем вдоль этой вертикальной линии, чтобы найти конечную точку в середине прямоугольника.
«Прямоугольник» не обязательно должен быть прямоугольным. Эти два измерения можно использовать для любой четырехсторонней фигуры (то есть вы можете перемещать углы своего прямоугольника куда угодно, и уравнения по-прежнему будут находить позиции между углами, чтобы заполнить область, ограниченную формой)
В примере, который вы нашли, автор использует четыре точки для описания формы источника (a, b, c, d) и еще четыре точки для описания формы назначения (e, f, g, h) *
Кроме того, они сделали вычисления более эффективными, решая уравнения для заполнения матрицы преобразования, которую можно умножить на точки для выполнения процесса отображения. Однако эффект такой же, как я описал выше. Надеюсь, мое объяснение немного облегчит вам «просмотр» того, что делают уравнения.