创建平滑线以连接三维中的N个点
Create smooth line to join N points in 3 dimensions
我在三维空间中有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个控制点的广义方法。
- 使用pcl transformcloud将三维点平移并旋转到原点
- 如何在Openscenegraph中从二维鼠标点击的屏幕坐标点计算三维点(世界坐标)
- 检查三个点是否线性
- 使用三个点(x,y),如何确定它是否是三角形
- 检查共面三维点时出现浮点错误
- OpenGL获取离当前鼠标位置最近的世界三维点的三维坐标
- 如何将三维点云转换为深度图像
- 在三维中查找点到三角形之间的距离
- 如何在现代openGL中绘制带有三维点的多边形
- 点云库中的凸包计算在二维和三维都失败
- 寻找用于模拟粒子轨迹的三维点和矢量几何C++库
- 在opengl中处理三维或二维图形的点击
- 在C++中删除矢量中三维点的重复项
- 确定三维点是否在轴对齐的立方体内的最快方法
- 如何在C++上可视化三维点
- 如何知道一个点是否与SolidWorks生成的CAD文件中的三维对象相交
- 在没有关于相机的信息的情况下从2个图像进行三维重建
- 从三个三维点计算变换矩阵
- 如何合并多个点云来构建三维地图
- 创建平滑线以连接三维中的N个点