基于MATLAB的B样条计算于可视化
B样条基函数
令 U = { u 0 , u 1 , ⋯ , u m } \mathbf{U}=\{u_0,u_1,\cdots,u_m\} U={u0,u1,⋯,um}为一个单调增的实数序列,即 u i ≤ u i + 1 , i = 0 , ⋯ , m − 1 u_i \leq u_{i+1},i=0,\cdots,m−1 ui≤ui+1,i=0,⋯,m−1。那么对于一个 p p p次B样条,其第 i i i个B样条基函数 N i , p ( u ) N_{i,p}(u) Ni,p(u)可以由p−1阶的两个B样条基函数线性表出:
N i , p ( u ) = u − u i u i + p − u i N i , p − 1 ( u ) + u i + p + 1 − u u i + p + 1 − u i + 1 N i , p ( u ) N_{i,p}(u)=\frac{u-u_i}{u_{i+p}-u_i}N_{i,p-1}(u)+\frac{u_{i+p+1}-u}{u_{i+p+1}-u_{i+1}}N_{i,p}(u) Ni,p(u)=ui+p−uiu−uiNi,p−1(u)+ui+p+1−ui+1ui+p+1−uNi,p(u)
其中 u i u_i ui称为节点(knots), U \mathbf{U} U称为节点向量。特别的,0阶的B样条基函数定义为:
N i , 0 ( u ) = { 1 if u i ≤ u < u i + 1 0 otherwise N_{i,0}(u) = \begin{cases} 1 & \text{if } u_i ≤ u < u_{i+1} \\ 0 & \text{otherwise} \end{cases} Ni,0(u)={10if ui≤u<ui+1otherwise
B样条曲面
B样条曲面是由多条B样条曲线在u,v两个方向上由 ( m + 1 ) × ( n + 1 ) (m+1) \times (n+1) (m+1)×(n+1)个控制点构成一张网格:
S ( u , v ) = Σ i = 0 n Σ j = 0 m N i , p ( u ) N j , p ( v ) P i , j S(u,v) = \Sigma_{i = 0}^n \Sigma_{j=0}^m N_{i,p}(u)N_{j,p}(v) P_{i,j} S(u,v)=Σi=0nΣj=0mNi,p(u)Nj,p(v)Pi,j
其中 P i j {P_{ij}} Pij为曲面的控制点,下图展示了一个基于双3次样条的贝壳曲面
基于MATLAB语言的实现
基于MATLAB平台开发了样条B-曲面的计算和可视化功能,通过3个实例演示了相关开发功能。
主要包括matlab软件图标、虎头、贝壳3个类型的曲面,函数自动读取控制点、节点向量,并构造和可视化样条,适合样条初学者学习
Demo演示
基于matlab的B样条曲面开发与可视化