Смущен сплайн-интерполяцией в трехмерном пространстве

Я должен признаться, что я действительно смущен доступным кодом и алгоритмами для трехмерной сплайн-интерполяции.
Для моего приложения мне нужен путь: учитывая некоторую точку, определенную в трехмерном пространстве, мне нужно интерполировать их, используя функцию сплайна (куб, Безье и т. Д.). Исследования в интернете не дали мне решения, только больше путаницы.

Этот алгоритм привлек мое внимание алгоритм. Он определяет некоторые трехмерные точки (используя MATLAB):

[X, Y, Z] = meshgrid(x, y, z);

а затем вызывает функцию интерполяции MATLAB:

s = exp(-sqrt(X.^2 + Y.^2 + Z.^2));

sinterp = interp3(x, y, z, s, 0., 0., 0.)

Какова функция s за!? Очевидно, что для интерполяции нужны только три пункта, и все. Для чего эта функция?

Так как я программист C ++, я пытался использовать следующее ALGLIB библиотека, которая предлагает некоторые полезные функции. Но даже если 3 балла не достаточно, я должен вызвать функцию, которую я не знаю.

В моем приложении трехмерные точки разбросаны случайным образом в пространстве следующим образом картина. Моя проблема не предполагает, что мне нужна функция для соединения точек. Даже если мне это нужно, я не знаю, как это определить.

Что плохого в том, как я подхожу к этой проблеме? Я использую неправильные библиотечные функции? или я должен иметь функцию для генерации сплайнов? Если да, то как мне получить эту функцию?

С уважением

1

Решение

interp3 () должен выполнять интерполяцию для точек объемных данных (Xi, Yi, Zi, Si), i = 1 ~ N. Будет сгенерирована функция S = f (X, Y, Z). Это причина, почему он нуждается в дополнительных входных данных, как отмечено в вашем посте.

Когда вы сталкиваетесь с проблемой / алгоритмом интерполяции, в первую очередь вам необходимо выяснить, какую функцию вы ищете. А именно, является ли функция одномерной (y = f (x)), двумерной (z = f (x, y)) или многомерной (s = f (x, y, z, ….)). Для вашей конкретной задачи, где вы хотите интерполировать серию трехмерных точек, используя сплайн, в основном это одномерная проблема интерполяции. Однако, поскольку пространственная кривая не может быть представлена ​​как y = f (x), функция сплайна будет представлена ​​в параметрической форме как S (t) = (x (t), y (t), z (t)).

Существует много способов выполнить сплайн-интерполяцию по точкам трехмерных данных. Среди них два очень простых в реализации алгоритма: сплайны Catmull Rom и сплайны Overhauser. Оба являются кубическим сплайном и отличаются только тем, как оцениваются первые производные в точках данных. Вы можете погуглить их, чтобы узнать подробности.

1

Другие решения

Не запутайся. Приведенный вами пример matlab имеет мало (или ничего) общего с интерполяцией линий между точками в трехмерном пространстве. Также s — это не символическая функция, а просто трехмерная матрица скалярных значений.

В этом примере с matlab создается 3 3D матрицы (X, Y, Z). Каждый из них содержит компоненты x, y или z соответственно точек в трехмерной сетке, для которых «выборочные плоскости» в каждом измерении определены массивами x, y, z.

Тогда функция f=exp(-sqrt(x^2 + y^2 + z^2)) оценивается для каждой из этих точек сетки, а результаты сохраняются в s (еще одна 3D-матрица). Так f скалярная функция, отображающая скалярное значение в точку в 3D-пространстве и s содержит оцененные результаты.

Наконец, значение для f в точке (0,0,0) экстраполируется из рассчитанных значений для точек сетки в окрестности (0,0,0).

К сожалению, я не могу указать вам правильную библиотеку c ++, которая будет делать то, что вы на самом деле хотите достичь, но опять же: не запутайтесь в этом примере (или любом другом примере с matlab), потому что
А) это другая проблема
Б) Синтаксис Matlab сильно отличается от синтаксиса Си, поэтому эти примеры легко неверно истолковать.

1

Параметрическая кривая имеет вид X = Fx(t), Y = Fy(t), Z = Fz(t), где t является независимым параметром и F три непрерывные функции. Это обобщает на любое количество измерений.

В случае Безье, F определяются как полиномы Бернштейна, умноженные на соответствующие координаты контрольных точек. Например, квадрика Безье

X = P0x (1-t)² + 2 P1x (1 - t)t + P2x t²
Y = P0y (1-t)² + 2 P1y (1 - t)t + P2y t²
Z = P0z (1-t)² + 2 P1z (1 - t)t + P2z t²

В случае кубический сплайн, F определяются кусочно, используя интерполяцию Эрмита и вычисляя производные (касательные векторы) таким образом, чтобы обеспечить непрерывность по частям.

На самом деле, интерполяция кривой в пространстве может рассматриваться как три независимых одномерных интерполяции.

(Это не совсем верно, когда есть зависимость между местоположениями точек данных и способом независимого параметра t вычисляется.)

0
По вопросам рекламы [email protected]