寻找三次 B 样条基函数极大点的优雅算法?

问题描述

现在,我正在实施(可能是非均匀的)B 样条曲线。我想要的一个功能是能够知道控制点在曲线上的哪个位置影响最大。根据我的理解,这相当于求解其关联 B 样条基函数的最大值点 uN(i,p,u)。 (其中i是控制点的索引,p是度数,u是曲线的参数)。

给定一个非递减的结向量 U,让第 i 个 B-Spline 基函数(度数为 p)定义如下(来自:https://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-basis.html):

enter image description here

和 B 样条曲线(来自:https://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-curve.html):

enter image description here

根据我的理解,b 样条基函数的可能最大点位于其定义域的端点处,以及当其导数为零时。

导数如下(https://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-derv.html):

enter image description here

对于这个问题,我们只处理三次 b 样条曲线(度数 p = 3)。让我们将 u_in 记为 u_(i+n)(例如 u_i0 -> u_i .... u_i3 -> u_(i+3)

N(i,3,u) 的域是 [u_i0,u_i4)

根据我的理解,导数 N'(i,u) 是基于每个结跨度分段定义的:[u_i0,u_i1)[u_i1,u_i2)[u_i2,u_i3)[u_i3,u_i4)

这是我对每个结跨度的导数计算(假设 u_j u_(j+1),否则忽略结跨度):

[u_i0,u_i1]

enter image description here

对于这个结跨度,导数在 u = u_i0 处为零。

[u_i3,u_i4]

enter image description here

对于这个结跨度,导数在 u = u_i4 处为零。

[u_i1,u_i2]

enter image description here

这个结跨度比较复杂,所以我将分别求解 N(i,2,u)N(i + 1,u)

enter image description here

enter image description here

我将这两项重新代入原始方程,然后根据 uu_i0u_i1、{{1} 用 wolframalpha 求解 u_i2 },u_i3。返回给我的是这只野兽:

enter image description here

哪里u_i4...t = u

u_j = u_ij

enter image description here

再次分别求解 [u_i2,u_i3]N(i,u)

enter image description here

enter image description here

我将这两项重新代入原始方程,然后根据 N(i + 1,u)uu_i0、{{1} 用 wolframalpha 求解 u_i1 },u_i2。返回给我的是这只野兽:

enter image description here

哪里u_i3...u_i4

.........

所以,总的来说,我当前的算法是获取 t = u 的可能最大点数。这些包括所有结跨度端点 u_j = u_ij。它们还包括导数为零的 u 值(取自上述等式)。

得到所有这些点后,我实际上计算了基函数的值并返回了{ u_i0,u_i1,u_i2,u_i3,u_i4 },它给了我最高的基函数值。

节点跨度 u间的导数方程非常复杂,我不确定如何将其扩展到更高的程度。有谁知道更可扩展、更优雅的解决方案?

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)