【问题标题】:How to connect two fitted B-spline curve?如何连接两条拟合的 B 样条曲线?
【发布时间】:2014-10-27 02:56:13
【问题描述】:

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

【问题讨论】:

    标签: curve-fitting smooth bspline


    【解决方案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方式连接起来。但是对公共关节周围原始数据点的误差会变大。

    【讨论】:

    • 您的回复对我很有帮助。你能澄清一下调整两个 B 样条的想法吗?我正在考虑使用这种方法,因为最小二乘并不重要。最好给一些链接或者论文。
    • @OP:我在答案中添加了更多关于如何调整 B 样条以实现 G1 连续性的内容。
    • 如果需要修改两个控制点P(n-2)和P(n-1),是否需要重新计算B样条C1(t)的全部点?
    • 没有。你不需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多