我在三维空间中有N个点。我需要使用一行来加入他们。但是,如果我使用一条简单的线条来做这件事,那就不顺畅了,看起来很难看。
我目前的方法是使用Bezier曲线,使用DeCasteljau算法获得4个点,并为我的数据集中的每组4个点运行该算法。然而,问题在于,因为我分别在1-4,5-8,9-12等点上运行它,所以在4-5,8-9等之间线条不平滑
我也寻找其他方法;特别是我发现this article关于Catmull-Rom样条曲线,它看起来更适合我的目的,因为曲线通过所有控制点,与Bezier曲线不同。所以我几乎开始实现它,但后来,我在该网站上看到公式有效"assuming uniform spacing of control points"
。我的问题不是这样的。
所以,我的问题是,我应该采用什么方法 - Bezier,Catmull-Rom或者完全不同的东西?如果Bezier,那么如何修复4-5,8-9之间的非平滑度等?如果Catmull-Rom,如果点间距不均匀,为什么公式不起作用?我需要做什么呢?
编辑:我现在很确定我想要Catmull-Rom样条,因为它通过了每个控制点,这对我的应用程序来说是一个优势。因此,我想回答的主要问题是为什么我提供的链接上的公式不适用于非均匀间隔的控制点?
感谢。
答案 0 :(得分:2)
一些解决方案:
使用B样条曲线。这是贝塞尔曲线的推广(贝塞尔曲线是 B样条,没有内部结点。)
使用三次样条曲线。三次样条特别容易计算。三次样条在控制点上的零,一,二阶导数中是连续的。三阶导数,即立方项,在控制点处存在不连续性,但很难看到这些不连续性。
B样条和三次样条之间的一个关键区别是三次样条曲线将通过所有控制点,而B样条曲线则不会。考虑它的一种方法:那些内部控制点只是B样条的建议,但对于三次样条是强制性的。
答案 1 :(得分:0)
可以通过高斯过程找到有意义的行(尽管不是最简单的评估)。您设置(或推断)您希望线条变化的长度范围(即线条的平滑度),然后GP线条是给定长度尺度的数据中最可能的线条。如果您不介意不通过数据点的线,则可以向模型添加噪声。
它是一种很好的插值方法,因为您还可以获得线条的标准偏差。当你在空旷地区没有太多数据时,这条线变得更加不确定。
您可以在David MacKay Information Theory, Inference, and Learning Algorithms
的第45章中了解它们 - 您可以从作者的网站here下载。
答案 2 :(得分:0)
一个解决方案是维基百科中的以下页面:http://en.wikipedia.org/wiki /Bézier_curve,检查N个控制点的通用方法。