Я должен признаться, что я действительно смущен доступным кодом и алгоритмами для трехмерной сплайн-интерполяции.
Для моего приложения мне нужен путь: учитывая некоторую точку, определенную в трехмерном пространстве, мне нужно интерполировать их, используя функцию сплайна (куб, Безье и т. Д.). Исследования в интернете не дали мне решения, только больше путаницы.
Этот алгоритм привлек мое внимание алгоритм. Он определяет некоторые трехмерные точки (используя 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 балла не достаточно, я должен вызвать функцию, которую я не знаю.
В моем приложении трехмерные точки разбросаны случайным образом в пространстве следующим образом картина. Моя проблема не предполагает, что мне нужна функция для соединения точек. Даже если мне это нужно, я не знаю, как это определить.
Что плохого в том, как я подхожу к этой проблеме? Я использую неправильные библиотечные функции? или я должен иметь функцию для генерации сплайнов? Если да, то как мне получить эту функцию?
С уважением
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. Оба являются кубическим сплайном и отличаются только тем, как оцениваются первые производные в точках данных. Вы можете погуглить их, чтобы узнать подробности.
Не запутайся. Приведенный вами пример 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 сильно отличается от синтаксиса Си, поэтому эти примеры легко неверно истолковать.
Параметрическая кривая имеет вид 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
вычисляется.)