我正在编写一个C ++程序来为一组点生成三次样条轨迹。这些点不需要沿x轴排序。例如,它可能是一个圆圈等。
我在网上找到了一些库,例如ALGLIB库或这里的类https://www.marcusbannerman.co.uk/index.php/home/42-articles/96-cubic-spline-class.html,但所有这些库都对数据点进行排序。我不需要这个,因为我想要生成的东西就像一个圆圈。反正有没有实现这个目标?
答案 0 :(得分:7)
样条线是关于某个自变量的分段函数(通常是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 :(得分: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中的样条模型之外,我不知道有任何实现,但理论上并不难做到。