如何连接两个拟合的B样条曲线?

时间:2014-10-27 02:56:13

标签: curve-fitting smooth bspline

我使用B样条曲线拟合来获得一条平滑曲线。如果我获得两个平滑的B样条,我怎样才能顺利连接。例如,我有59个点((x0,y0,z0),...,(x58,y58,z58)),我有两个拟合的B样条。一个B样条用于前30个点,另一个用于接下来的30个点,两个点集共享一个公共点((x29,y29,z29))。由于曲线拟合,点(x29,y29,z29)将被修改两次,并且将具有两个新位置。如果我只连接两个新位置,则最终曲线在该点(x29,y29,z29)处将不平滑。目前我对所有数据进行曲线拟合,但这将完全修改前30个点的平滑曲线。我希望只修改第一条平滑曲线的连接部分。我知道我需要强制衍生品需要在联合中保持平等。我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

看起来你正在使用B样条曲线或类似的东西进行LS拟合,并且通常以这种方式获得的B样条将不会传递任何数据点。这就是为什么两个B样条在公共点上不相符的原因。

要解决此问题,您可以增强LS拟合函数以将约束作为输入的一部分。在您的情况下,这些约束是线性的,因此您的问题仍然是线性的。完成此步骤后,您可以预先计算公共点处的斜率,并将B样条拟合约束到公共点和公共斜率。这样,获得的两个B样条在公共点处至少是G1连续的。

说到这里,实现约束LS拟合并不是一项微不足道的任务,这里也不容易详述。所以,你必须做一些"谷歌搜索"你自己。另一种解决方案是"调整"你的两个B样条曲线以G1方式连接它们。但这样做肯定会增加拟合误差,因为最小平方误差的意义被破坏了。通过"调整",我打算在本地更改B样条的控制点。在下文中,我将提供更多细节。

假设您有两个B样条C1(t)和C2(t),C1(t)的最后两个控制点是P(n-2)和P(n-1)以及前两个控制点C2(t)的曲线是Q(0)和Q(1)。假设P(n-1)和Q(0)接近两个数据集的公共点(x29,y29,z29)。调整B样条曲线简单地意味着改变P(n-2),P(n-1),Q(0)和Q(1)的位置,使得这两个B样条曲线将以G1方式相交。为此,

1)我们首先将P(n-1)和Q(0)移动到同一位置,即(x29,y29,z29)或简单地说是P(n-1)之间的中点,使它们成为G0和Q(0)。我们将这个新位置表示为R.

2)现在,检查P(n-2),R和Q(1)是否共线。如果它们碰巧是共线的,那么两条B样条曲线也将是G1,你就完成了。如果它们不共线,找到从P(n-2)和Q(1)通过R的最佳近似线,然后将P(n-2)和Q(1)投影到该线上并使用投影点作为P(n-2)和Q(1)的新位置。

在这两个步骤之后,这两条B样条曲线应以G1方式连接。但是普通关节周围原始数据点的误差会变大。