给定空间中任意一组点序列,如何在它们之间生成平滑连续的插值?
欢迎提供2D和3D解决方案。既能产生任意粒度点列表的解决方案,也能产生贝塞尔曲线的控制点的解决方案。
此外,如果能够看到一种迭代解决方案,该解决方案可以在接收到点时近似前几个曲线段,以便您可以使用它进行绘制,则非常酷。
给定空间中任意一组点序列,如何在它们之间生成平滑连续的插值?
欢迎提供2D和3D解决方案。既能产生任意粒度点列表的解决方案,也能产生贝塞尔曲线的控制点的解决方案。
此外,如果能够看到一种迭代解决方案,该解决方案可以在接收到点时近似前几个曲线段,以便您可以使用它进行绘制,则非常酷。
Catmull-Rom样条能够通过所有控制点,相较于调整其他类型的样条的中间控制点,我发现这更方便。
Christopher Twigg的PDF文档对于样条的数学知识有一个简明的介绍。最好的总结语句是:
Catmull-Rom样条具有C1连续性、局部控制和插值特性,但不在其控制点的凸包内。
换句话说,如果点指示向右急转弯,则样条将在向右转弯之前向左倾斜(该文档中有一个示例图片)。这些转弯的紧密程度可通过该示例矩阵中的tau参数进行控制。
这里是另一个示例,其中包含一些可下载的DirectX代码。
一种方法是使用拉格朗日插值多项式,这是一种产生通过所有给定数据点的多项式的方法。
在我大学的第一年,我写了一个小工具来处理二维数据,你可以在这个页面找到它,它叫做Lagrange solver。维基百科的页面上也有一个示例实现。
它的工作原理如下:你有一个n阶多项式p(x)
,其中n是你拥有的数据点的数量。它的形式为a_n x^n + a_(n-1) x^(n-1) + ...+ a_0
,其中_
是下标,^
是幂次。然后将其转换为一组同时方程:
p(x_1) = y_1
p(x_2) = y_2
...
p(x_n) = y_n
我之前遇到了同样的问题,最近和一些朋友一起实现了它。我想在 Github 上分享这个示例项目。
你看过Unix的spline命令吗?它能被强制转换成你想要的功能吗?
不幸的是,拉格朗日或其他形式的多项式插值不能在任意点集上工作。它们只适用于一维情况下的点集,例如 x
xi < xi+1
对于任意点集,例如飞机的飞行路径,其中每个点都是(经度,纬度)对,您最好只需使用当前经度和纬度以及速度来模拟飞机的旅程。通过根据飞机距离下一个航路点的距离调整其转弯速率(角速度),您可以实现平滑曲线。
生成的曲线在数学上并不重要,也不会给您贝塞尔控制点。但是,无论航路点数量如何,该算法都非常简单,并且可以产生任意粒度的插值点列表。它也不需要您提前提供完整的点集,您只需根据需要向点集末尾添加航路点即可。