Интерполяция высоты для точки внутри сетки на основе дискретной функции высоты - PullRequest
5 голосов
/ 22 марта 2010

Я ломал голову над решением этой проблемы.

Point P inside a grid square.

У меня есть справочная таблица, которая возвращает значения высоты для различных точек (x, z) на сетке. Например, я могу вычислить высоту в точках A, B, C и D на рисунке 1. Однако я ищу способ интерполировать высоту в точке P (которая известна (x, z)). Таблица поиска имеет значения только в интервалах сетки, а P лежит между этими интервалами. Я пытаюсь вычислить значения s и t , такие что:

A '(s) = A + s (C-A) B '(t) = B + t (P-B)

Затем я бы использовал эти два уравнения, чтобы найти точку пересечения B '(t) с A' (s), чтобы найти точку X на прямой A-C. С этим я могу вычислить высоту в этой точке X и с этим высоту в точке P.

Моя проблема заключается в вычислении значений для s и т.

Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

3 голосов
/ 23 марта 2010
1 голос
/ 22 марта 2010

Как насчет того, чтобы пойти по этому пути: найдите u и v, чтобы

  P = B + u(A-B) + v(C-B)

Если вы напишите это, вы увидите, что это линейная система 2x2 с неизвестными uи v, так что, я думаю, вы знаете, как идти дальше.

О, и когда у вас есть u и v, вы используете ту же самую точную формулу, что и выше для высоты, только на этот раз A,B,C,P будет высотой в этих точках.

1 голос
/ 22 марта 2010

В зависимости от того, хотите ли вы интерполировать между ABC или ABCD, алгоритм изменится.

Для интерполяции между ABC (что, как я полагаю, вам нужно, поскольку вы рисуете диагональ), вам нужно найтизатем барицентрические координаты P относительно положений x и y ABC применяют барицентрическую координату к компоненту высоты (здесь предполагается z) этих треугольников.

0 голосов
/ 02 апреля 2010

Вот явный пример, основанный на функциях формы.

Рассмотрим функции:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...