C ++ Cubic Spline轨迹

时间:2011-12-21 14:45:29

标签: c++ math polynomial-math spline

我正在编写一个C ++程序来为一组点生成三次样条轨迹。这些点不需要沿x轴排序。例如,它可能是一个圆圈等。

我在网上找到了一些库,例如ALGLIB库或这里的类https://www.marcusbannerman.co.uk/index.php/home/42-articles/96-cubic-spline-class.html,但所有这些库都对数据点进行排序。我不需要这个,因为我想要生成的东西就像一个圆圈。反正有没有实现这个目标?

2 个答案:

答案 0 :(得分:7)

样条线是关于某个自变量的分段函数(通常是t,尽管它们似乎在您链接的代码中使用x。由于要评估的特定函数取决于最接近输入值t的控制点,因此有必要按t对控制点进行排序,以便您可以快速确定需要评估的函数。

然而,即使它们没有排序,您仍然无法创建具有单个一维样条线的圆。您的样条函数y = f(t)仅为您提供任何给定t的值。如果您相对于y绘制t图表并想要一个半径为1的圆关于原点,则需要f(0)等于1-1 ,这没有任何意义。

要获得类似圆形的东西,您需要使用二维样条曲线或两个样条曲线;一个用于x值,另一个用于y值。获得这两个样条函数f(t)g(t)之后,您只需在同一t评估这两个函数,这将为您提供xy您的样条曲线的值为t

答案 1 :(得分:1)

简单,常见的技巧是使用累积线性arclength作为参数。所以,如果我在曲线中有一组点作为x和y为向量的平面中的简单(x,y)对,请执行以下操作:

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

这给出了沿着每对点之间的分段线性段的累积距离,按照它们的顺序显示。将样条曲线拟合为两个单独的样条曲线模型,即x(t)和y(t)。因此,您可以使用interp1,或直接使用样条线或pchip函数。请注意,在构建插值时,pchip和样条曲线将具有不同的属性。

最后,如果你确实有一个闭合曲线,那么x(1)和x(end)应该是相同的,那么你真的想要使用具有周期性结束条件的样条模型。除了我SLM tools中的样条模型之外,我不知道有任何实现,但理论上并不难做到。