我正在编写一个 C++ 程序来为一组点生成三次样条轨迹。这些点不需要沿 x 轴排序。例如,它可能是一个圆圈等。
我在网上找到了一些库,例如 ALGLIB 库或这里的一个类https://www.marcusbannerman.co.uk/index.php/home/42-articles/96-cubic-spline-class.html,但所有这些库都对数据点进行排序。我不需要这个,因为我想要生成的是类似于圆圈的东西。有没有办法做到这一点?
我正在编写一个 C++ 程序来为一组点生成三次样条轨迹。这些点不需要沿 x 轴排序。例如,它可能是一个圆圈等。
我在网上找到了一些库,例如 ALGLIB 库或这里的一个类https://www.marcusbannerman.co.uk/index.php/home/42-articles/96-cubic-spline-class.html,但所有这些库都对数据点进行排序。我不需要这个,因为我想要生成的是类似于圆圈的东西。有没有办法做到这一点?
样条线是关于某些自变量的分段函数(通常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
。
简单而常见的技巧是使用累积线性弧长作为参数。因此,如果我在一条曲线中有一组点作为平面中的 (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 工具中的样条模型外,我不知道有任何实现,但理论上不难做到。