2011-12-21 79 views
0

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

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

回答

7

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

但是,即使它们没有排序,仍然无法用单个一维样条线创建一个圆。你的样条函数y = f(t)只给你一个给定的值t。如果您正在对t绘制y并且想要一个关于原点的半径为1的圆,则需要f(0)来等于1-1,这没有任何意义。

要得到类似圆形的东西,您需要一个二维样条曲线或两个样条曲线;一个用于x值,另一个用于y值。一旦你有这两个样条函数f(t)g(t),那么你只需要在同一个t处同时评估这两个函数,并且这将给出和y这个t的样条值。

+0

我明白了。非常感谢。 – Arthur 2011-12-21 20:38:31

1

简单,常见的技巧是使用累积线性arclength作为参数。所以,如果我有一组曲线的点作为简单的(X,Y)在x和y是向量的平面对,这样做:

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

这让我们沿着分段线性的累积距离按照您拥有的顺序呈现每对点之间的分段。将样条曲线拟合为两个独立的样条模型,即x(t)和y(t)。所以你可以使用interp1,或直接使用spline或pchip功能。请注意,pchip和样条线在构建插值时会有不同的属性。最后,如果你确实有一条闭合曲线,那么x(1)和x(end)应该是相同的,那么你真的想要使用具有周期性结束条件的样条模型。我不知道除了在我的SLM tools的样条模型中的任何实现,但理论上这并不困难。

+0

是的,我也在考虑使用距离作为参数t。非常感谢 : - ) – Arthur 2011-12-22 04:27:23