如何解决寻找三次 B 样条基函数极大点的优雅算法?
现在,我正在实施(可能是非均匀的)B 样条曲线。我想要的一个功能是能够知道控制点在曲线上的哪个位置影响最大。根据我的理解,这相当于求解其关联 B 样条基函数的最大值点 u
:N(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):
和 B 样条曲线(来自:https://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-curve.html):
根据我的理解,b 样条基函数的可能最大点位于其定义域的端点处,以及当其导数为零时。
导数如下(https://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-derv.html):
对于这个问题,我们只处理三次 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]
:
对于这个结跨度,导数在 u = u_i0
处为零。
[u_i3,u_i4]
:
对于这个结跨度,导数在 u = u_i4
处为零。
[u_i1,u_i2]
:
这个结跨度比较复杂,所以我将分别求解 N(i,2,u)
和 N(i + 1,u)
。
我将这两项重新代入原始方程,然后根据 u
、u_i0
、u_i1
、{{1} 用 wolframalpha 求解 u_i2
},u_i3
。返回给我的是这只野兽:
哪里u_i4
...t = u
。
u_j = u_ij
:
再次分别求解 [u_i2,u_i3]
和 N(i,u)
。
我将这两项重新代入原始方程,然后根据 N(i + 1,u)
、u
、u_i0
、{{1} 用 wolframalpha 求解 u_i1
},u_i2
。返回给我的是这只野兽:
哪里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 举报,一经查实,本站将立刻删除。