我正在开发一个3D图形应用程序,用户可以在其中绘制曲线。我记录用户绘制的曲线,我想从记录的点集创建一个平滑的 nurb。我尝试使用 openNurbs 库,但我找不到使用该库进行拟合的方法。如何将一组点拟合到nurb?
首先,我认为你不需要 nurbs。将 B 样条曲线拟合到数据点应该足够好。
如果您只有几十个点,那么您可能希望 B 样条曲线准确地通过这些数据点。在本例中,您正在寻找样条插值算法。如果是这种情况,您可以使用 Catmull Rom 样条或 Overhauser 样条来插值您的数据点。两者都将创建 C1 三次样条曲线,并且都易于实现,无需求解线性方程组。
如果您有几百个点,那么您很可能只希望 B 样条曲线靠近数据点。然后,您正在寻找的算法是最小二乘拟合。您可以在线找到此领域的大量文章(例如:link1(。使用 B 样条曲线进行最小二乘拟合的典型算法将涉及以下步骤:
1( 为数据点选择参数化。 弦长参数化通常是最小二乘拟合的不错选择。
2( 选择 B 样条的度数。通常,我们使用度数 3,即三次 B 样条。
3( 确定 B 样条的控制点数量。
4(根据前3个步骤中的信息确定结向量。
5(求解线性方程组以求出B样条的控制点。