C ++ Траектория кубического сплайна - PullRequest
0 голосов
/ 21 декабря 2011

Я пишу программу на C ++ для генерации траектории кубического сплайна для набора точек. Эти точки не нужно сортировать вдоль оси X. Например, это может быть круг и т. Д.

Я нашел в Интернете некоторые библиотеки, например, библиотеку ALGLIB или класс https://www.marcusbannerman.co.uk/index.php/home/42-articles/96-cubic-spline-class.html,, но все эти библиотеки сортируют точки данных. Мне это не нужно, потому что я хочу создать что-то вроде круга. Есть ли способ достичь этого?

Ответы [ 2 ]

7 голосов
/ 21 декабря 2011

Сплайны являются кусочными функциями по отношению к некоторой независимой переменной (обычно t, хотя они, кажется, используют x в коде, который вы связали).Поскольку конкретная функция, подлежащая оценке, зависит от контрольных точек, ближайших к входному значению t, имеет смысл отсортировать контрольные точки по t, чтобы можно было быстро определить функцию, которая должна быть оценена.

Однако даже если они не были отсортированы, вы все равно не могли бы создать круг с одним одномерным сплайном.Ваша сплайн-функция y = f(t) дает вам только одно значение для любого заданного t.Если вы строите график y относительно t и хотите окружность с радиусом 1 относительно начала координат, вам нужно, чтобы f(0) равнялся 1 и -1, что не имеет никакого смысла.

Чтобы получить что-то вроде круга, вместо этого вам нужен двухмерный сплайн или два сплайна;один для значения x и один для значения y.Если у вас есть эти две сплайн-функции f(t) и g(t), вы просто оцените обе функции на одном и том же t, и это даст вам значения x и y вашего сплайна для этого t.

1 голос
/ 22 декабря 2011

Простой, распространенный трюк заключается в использовании кумулятивной линейной длины дуги в качестве параметра. Итак, если у меня есть набор точек на кривой в виде простых (x, y) пар на плоскости, где x и y - векторы, сделайте следующее:

t = cumsum([0;sqrt(diff(x(:)).^2 + diff(y(:)).^2)]);

Это дает нам совокупное расстояние вдоль кусочно-линейных отрезков между каждой парой точек, представленное в том порядке, в котором они у вас есть. Установите кривую сплайна как две отдельные модели сплайна, таким образом, x (t) и y (t). Таким образом, вы можете использовать interp1 или напрямую использовать функции spline или pchip. Обратите внимание, что pchip и spline будут иметь разные свойства при построении этого интерполятора.

Наконец, если у вас действительно была замкнутая кривая, так что x (1) и x (end) должны были быть одинаковыми, тогда вы действительно захотите использовать сплайн-модель с периодическими конечными условиями. Я не знаю каких-либо реализаций для этого, кроме сплайновой модели в моих инструментах SLM , но это не сложно сделать в теории.

...