0

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

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

4

2 回答 2

7

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

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

要获得类似圆形的东西,您需要一个二维样条或两个样条;一个代表x价值,一个代表y价值。一旦你有了这两个样条函数f(t)g(t),那么你只需同时评估这两个函数,t这将为你提供样条函数的xyt

于 2011-12-21T15:18:42.957 回答
1

简单而常见的技巧是使用累积线性弧长作为参数。因此,如果我在一条曲线中有一组点作为平面中的 (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 工具中的样条模型外,我不知道有任何实现,但理论上不难做到。

于 2011-12-21T22:19:35.610 回答