在三维空间中连接N个点,创建平滑的连续线

5
我在3维空间中有N个点。我需要用一条线将它们连接起来。然而,如果我使用简单的直线,那么它看起来不够平滑,也不美观。
我的当前方法是使用Bezier曲线,使用DeCasteljau算法处理4个点,并对数据集中每组4个点运行该算法。但是,这种方法的问题在于,由于我分别运行它(例如点1-4、5-8、9-12等),因此在4-5、8-9等之间的连线不够平滑。
我还寻找其他方法;具体地说,我发现了关于Catmull-Rom样条的 这篇文章 ,它似乎更适合我的目的,因为该曲线通过所有控制点,而不像Bezier曲线。因此,我几乎要开始实施它了,但后来我在该网站上看到,该公式假设控制点均匀分布。而我的问题并非如此。
所以,我的问题是,我应该使用什么方法——Bezier、Catmull-Rom,还是完全不同的方法?如果使用Bezier,则如何解决4-5、8-9等之间的不平滑问题?如果使用Catmull-Rom,则为什么该公式不能用于非均匀间距的控制点,我需要什么替代方法?
编辑:我现在非常确定我想要Catmull-Rom样条,因为它通过每个控制点,这对我的应用程序是一个优势。因此,我想回答的主要问题是,为什么我提供的链接上的公式不能用于非均匀间距的控制点?
谢谢。

你的线的目的是什么?你只是想要一条看起来舒服的线,还是想要更具量化意义的东西。例如,假设您希望通过数据点找到最可能的曲线,假设有高斯噪声? - Tom
@Tom:基本上我从物理模拟中获取点,线条的平滑只是为了展示最终结果,所以我想这只是为了让人看起来舒服 :) - houbysoft
1
@houbysoft 如果是这样,你为什么想要自己编写绘图器呢?为什么不只输出数据并在 gnuplot 中绘制呢? - Tom
1
@Tom:最终结果将在一个特殊的3D房间中展示,由多台计算机操作,需要一个特定的应用程序来完成工作。此外,我还需要为绘图仪添加一些交互功能,比如与头部跟踪设备进行通信等。关键是,这个应用程序非常特定,不仅仅是显示线条,因此gnuplot无法胜任。 - houbysoft
你想让线路在穿过每个点的同时保持平滑,还是只是简单地穿过这些点而不必经过每一个点?如果是后者,请搜索“多维回归分析”。 - Tamer Shlash
@Mr.TAMER:只需通过每个点并保持顺畅。 - houbysoft
3个回答

3

有几个解决方案:

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

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

B样条曲线和三次样条曲线之间的一个关键区别是,三次样条曲线将通过所有控制点,而B样条曲线则不会。一种思考方式是:那些内部控制点只是B样条曲线的建议,但对于三次样条曲线来说是必须的。


补充一下,三次样条曲线并不需要像OP所说的那样控制点间距是均匀的。你只需要一个好的参数化方法(如果可以的话,使用弧长参数化)来确保插值点的均匀分布。特别是要注意Cardinal样条曲线(其中Catmull-Rom是一个子类),它们具有可调节的曲率(张力),是一个非常适合图形学的小型三次样条曲线。 - Ron Warholic
@Ron Warholic:啊,所以基本上如果我使用非均匀间距点的公式,唯一的问题就是如果我总是为每对数据点绘制10个新曲线点,有时这些新点将不会均匀分布,对吗? - houbysoft
基本上,如果你根据控制点之间的弧长参数化插值,你将得到几乎完美间隔的点 - 不过这可能会更难实现。 - Ron Warholic

0

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

这是一种很好的插值方法,因为您还可以获得线的标准差。当您在附近没有太多数据时,该线变得更加不确定。

您可以在David MacKay的《信息论、推理和学习算法》第45章中阅读有关它们的内容,您可以从作者的网站here下载该书。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接