创建平滑线以连接三维中的N个点

Create smooth line to join N points in 3 dimensions

本文关键字:个点 三维 连接 平滑 创建      更新时间:2023-10-16

我在三维空间中有N个点。我需要排队加入他们。然而,如果我用一条简单的线来做,它就不光滑,看起来很难看。

我目前的方法是使用贝塞尔曲线,对4个点使用DeCasteljau算法,并对我的数据集中的每组4个点运行该算法。然而,这方面的问题是,由于我分别在1-4、5-8、9-12等点上运行,因此4-5、8-9等之间的线并不平滑。

我也在寻找其他方法;特别是我发现了这篇关于Catmull-Rom样条曲线的文章,它似乎更适合我的目的,因为曲线通过所有控制点,而不是Bezier曲线。所以我几乎开始实现它,但后来,我在那个网站上看到这个公式适用于"assuming uniform spacing of control points"。我的问题不是这样的。

所以,我的问题是,我应该使用什么方法——Bezier、Catmull Rom,或者完全不同的方法?如果是贝塞尔,那么如何固定4-5、8-9之间的不平滑度呢。?如果Catmull Rom,如果点间距不均匀,为什么公式不起作用?我需要什么?

编辑:我现在很确定我想要Catmull-Rom样条曲线,因为它通过了每个控制点,这对我的应用程序来说是一个优势。因此,我想回答的主要问题是,为什么我提供的链接上的公式不适用于非均匀间隔的控制点?

谢谢。

几个解决方案:

  • 使用B样条曲线。这是贝塞尔曲线的推广(贝塞尔曲线没有内部结点的B样条曲线。)

  • 使用三次样条曲线。三次样条曲线特别容易计算。三次样条曲线在控制点上的零、一阶和二阶导数是连续的。三阶导数,即三次项,在控制点处存在不连续性,但很难看到这些不连续性。

B样条曲线和三次样条曲线之间的一个关键区别是,三次样条曲线会通过所有控制点,而B样条线不会。一种想法是:这些内部控制点只是B样条的建议,但对于三次样条是强制性的。

通过高斯过程可以找到一条有意义的线(尽管不是最简单的评估线)。您设置(或推断)希望线条变化的长度比例(即线条的平滑度),然后GP线条是给定长度比例的数据中最可能的线条。如果不介意线不穿过数据点,可以向模型添加噪波。

这是一种很好的插值方法,因为你也可以获得直线的标准偏差。当你在真空中没有太多数据时,这条线变得更加不确定。

你可以在David MacKay的Information Theory, Inference, and Learning Algorithms的第45章中阅读这些内容,你可以从作者的网站上下载。

一个解决方案是维基百科中的以下页面:http://en.wikipedia.org/wiki/Bézier_curve,检验N个控制点的广义方法。