我使用 B 样条曲线拟合来获得一条平滑曲线。如果我获得两个平滑的 B-spline ,我如何才能顺利连接。例如,我有 59 个点 ((x0,y0,z0),...,(x58, y58, z58)) 并且我有两个拟合的 B 样条。一个 B 样条用于前 30 个点,另一个用于接下来的 30 个点,两个点集共享一个公共点 ((x29,y29,z29))。由于曲线拟合,点 (x29,y29,z29) 将被修改两次,并将有两个新位置。如果我只是连接两个新位置,则最终曲线在点 (x29,y29,z29) 处将不平滑。目前我对所有数据执行曲线拟合,但这将完全修改前 30 个点的平滑曲线。我希望只修改第一条平滑曲线的连接部分。我知道我需要在联合处施加必须相等的导数。我不知道该怎么做。
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) 移动到同一位置使它们成为 G0,该位置可以是 (x29, y29, z29) 或只是 P(n-1) 和 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方式连接起来。但是对公共关节周围的原始数据点的误差会变大。