Вот явный пример, основанный на функциях формы.
Рассмотрим функции:
u1 (x, z) = (x-x_b) / (x_c-x_b)
Один имеет u1 (x_b, z_b) = u1 (x_a, z_a) = 0 (потому что x_a = x_b) и u1 (x_c, z_c) = u1 (x_d, z_d) = 1
u2 (x, z) = 1 - u1 (x, z)
Теперь мы имеем u2 (x_b, z_b) = u2 (x_a, z_a) = 1 и u2 (x_c, z_c) = u2 (x_d, z_d)= 0
v1 (x, z) = (z-z_b) / (z_a-z_b)
Эта функция удовлетворяет v1 (x_a, z_a) = v1 (x_d, z_d) = 1и v1 (x_b, z_b) = v1 (x_c, z_c) = 0
v2 (x, z) = 1 - v1 (x, z)
Имеется v2 (x_a, z_a) = v2 (x_d, z_d) = 0 и v2 (x_b, z_b) = v2 (x_c, z_c) = 1
Теперь давайте создадим новые функции следующим образом:
S_D (x,z) = u1 (x, z) * v1 (x, z)
Мы получаем S_D (x_d, z_d) = 1 и S_D (x_a, z_a) = S_D (x_b, z_b) = S_D (x_c, z_c) = 0
S_C (x, z) = u1 (x, z) * v2 (x, z)
Получаем S_C (x_c, z_c) = 1 и S_C (x_a, z_a) = S_C (x_b, z_b) = S_C (x_d, z_d) = 0
S_A (x, z) = u2 (x, z) * v1 (x, z)
Мы получаем S_A (x_a,z_a) = 1 и S_A (x_b, z_b) = S_A (x_c, z_c) = S_A (x_d, z_d) = 0
S_B (x, z) = u2 (x, z) * v2 (x, z)
Мы получаем S_B (x_b, z_b) = 1 и S_B (x_a, z_a) = S_B (x_c, z_c) = S_B (x_d, z_d) = 0
Теперь определимВаша интерполирующая функция выглядит как
H (x, z) = h_a * S_A (x, z) + h_b * S_B (x, z) + h_c * S_C (x, z) + h_d * S_D (x,z),
где h_a - высота в точке A, h_b - высота в точке B и т. д.
Вы можете легко проверить, что H действительно является интерполяционной функцией:
H (x_a, z_a) = h_a, H (x_b, z_b) = h_b, H (x_c, z_c) = h_c и H (x_d, z_d) = h_d.
Теперь по порядкучтобы приблизить высоту в точке P, все, что вам нужно сделать, это оценить H в этой точке:
h_p = H (x_p, z_p)
Функции S обычно называют «функциями формы»».Есть одна такая функция для каждого узла, от которой вы хотите, чтобы ваше интерполированное значение зависело, и в этом случае все они удовлетворяют дельта-свойству Кронекера (они принимают значение один в одном узле и ноль во всех остальных узлах).
ТамЕсть много способов построить функции формы для данного набора узлов.Если я правильно помню, построение двумерных функций формы путем умножения одномерных функций формы (как мы это сделали в этом случае) называется «тензорным произведением функций» (в данном случае это легко, поскольку сетка является прямоугольной).В итоге мы получили четыре функции (по одной на узел), каждая из которых представляет собой линейные комбинации {1, x, z, xz}.
Если вы хотите использовать только три точки для интерполяции, то вам следуетбыть в состоянии легко построить три функции формы как линейные комбинации только {1, x, z}, но вы потеряете 25% информации о высоте, предоставляемой сеткой, и ваш интерполант не будет гладким внутри прямоугольника, когда h_b! =h_d.