N U R B S NURBS NURBS曲线曲面
曲线定义:
N
U
R
B
S
NURBS
NURBS曲线通常称为非均匀有理B样条,其数学定义如下:
P
(
t
)
=
∑
i
=
0
n
N
i
,
k
(
t
)
ω
i
P
i
∑
i
=
0
n
N
i
,
k
(
t
)
ω
i
,
t
∈
[
0
,
1
]
P(t)=\frac{\sum_{i=0}^nN_{i,k}(t)\omega_iP_i}{\sum_{i=0}^nN_{i,k}(t)\omega_i},t\in[0,1]
P(t)=∑i=0nNi,k(t)ωi∑i=0nNi,k(t)ωiPi,t∈[0,1]
式中,
ω
i
,
i
=
0
,
1
,
.
.
.
,
n
\omega_i,i=0,1,...,n
ωi,i=0,1,...,n称为权因子,分别与控制点
P
i
,
i
=
0
,
1
,
.
.
.
,
n
P_i,i=0,1,...,n
Pi,i=0,1,...,n相联系。首末权因子
ω
0
,
ω
n
>
0
\omega_0,\omega_n>0
ω0,ωn>0,其余
ω
i
≥
0
\omega_i≥0
ωi≥0,且顺序k个权因子不同时为零。把首末权因子都等于1的
N
U
R
B
S
NURBS
NURBS曲线称为标准型
N
U
R
B
S
NURBS
NURBS曲线,否则称为非标准型
N
U
R
B
S
NURBS
NURBS曲线。
N
i
,
k
(
t
)
N_{i,k}(t)
Ni,k(t)是由节点向量
T
=
[
t
0
,
t
1
,
.
.
.
,
t
n
+
k
+
1
]
T=[t_0,t_1,...,t_{n+k+1}]
T=[t0,t1,...,tn+k+1]上按照
d
e
B
o
o
r
−
C
o
x
deBoor-Cox
deBoor−Cox递推公式决定的k次规范B样条基函数。对于
N
U
R
B
S
NURBS
NURBS开曲线,通常将两端节点的重复度取为
k
+
1
k+1
k+1,即
t
0
=
t
1
=
.
.
.
=
t
k
,
t
n
+
1
=
t
n
+
2
=
.
.
.
=
t
n
+
k
+
1
t_0=t_1=...=t_k,t_{n+1}=t_{n+2}=...=t_{n+k+1}
t0=t1=...=tk,tn+1=tn+2=...=tn+k+1。
权因子:
权因子对 N U R B S NURBS NURBS曲线的影响是:
- 当保持控制顶点与其他权因子不变,减小或增加权因子时,起到把曲线推离和拉向相应顶点的作用。
曲面定义
p ( u , v ) = ∑ i = 0 m ∑ j = 0 n N i , p ( u ) N j , q ( v ) ω i j P i j ∑ i = 0 m ∑ j = 0 n N i , p ( u ) N j , q ( v ) ω i j , ( u , v ) ∈ [ 0 , 1 ] × [ 0 , 1 ] p(u,v)=\frac{\sum_{i=0}^m\sum_{j=0}^nN_{i,p}(u)N_{j,q}(v)\omega_{ij}P_{ij}}{\sum_{i=0}^m\sum_{j=0}^nN_{i,p}(u)N_{j,q}(v)\omega_{ij}},(u,v)\in[0,1]\times[0,1] p(u,v)=∑i=0m∑j=0nNi,p(u)Nj,q(v)ωij∑i=0m∑j=0nNi,p(u)Nj,q(v)ωijPij,(u,v)∈[0,1]×[0,1]
式中, P i j , i = 0 , 1 , . . . , m , j = 0 , 1 , . . . , n P_{ij},i=0,1,...,m,j=0,1,...,n Pij,i=0,1,...,m,j=0,1,...,n构成控制网格。 ω i j \omega_{ij} ωij是与定点 P i j P_{ij} Pij联系的权因子,规定四角定点处用正权因子即 ω 00 , ω m 0 , ω 0 n , ω m n > 0 \omega_{00},\omega_{m0},\omega_{0n},\omega_{mn}>0 ω00,ωm0,ω0n,ωmn>0,其余 ω i j ≥ 0 \omega_{ij}≥0 ωij≥0且顺序 p × q p\times q p×q个权因子不同是为零。 N i , p ( u ) , i = 0 , 1 , . . . , m N_{i,p}(u),i=0,1,...,m Ni,p(u),i=0,1,...,m和 N j , q ( v ) , j = 0 , 1 , . . . , n N_{j,q}(v),j=0,1,...,n Nj,q(v),j=0,1,...,n分别为定义在节点矢量U和V上的非有理B样条基函数。节点矢量U= [ u 0 , u 1 , . . . , u m + p + 1 ] [u_0,u_1,...,u_{m+p+1}] [u0,u1,...,um+p+1]与V= [ v 0 , v 1 , . . . , v n + q + 1 ] [v_0,v_1,...,v_{n+q+1}] [v0,v1,...,vn+q+1]按Hartley-Judd(哈特利-贾德)方法决定(第一个节点和最后一个节点必须是重复度为k+1。这就产生了所谓的clamped B-样条曲线,产生的曲线的开始和结尾连接在一起形成了一个闭环)。代码如下所示:
void HJ_calculate_knot(void)
{
//两端点取K+1个重复度
for(int i=0; i<=k; i++)
knot[i]=0.0;
for(int i=n+1; i<=n+k+1; i++)
knot[i]=1.0;
//计算n-k个内节点
for(int i=k+1; i<=n; i++)
{
double sum=0.0;
for(int j=k+1; j<=i; j++)
{
//计算分子项
double numerator=0.0;
for(int loop=j-k; loop<=j-1; loop++)
{
numerator+=sqrt((P[loop].x-P[loop-1].x)*(P[loop].x-P[loop-1].x)
+(P[loop].y-P[loop-1].y)*(P[loop].y-P[loop-1].y));
}
//计算分母项
double denominator=0.0;
for(int loop1=k+1; loop1<=n+1; loop1++)
{
for(int loop2=loop1-k; loop2<=loop1-1; loop2++)
{
denominator+=sqrt((P[loop2].x-P[loop2-1].x)*(P[loop2].x-P[loop2-1].x)
+(P[loop2].y-P[loop2-1].y)*(P[loop2].y-P[loop2-1].y));
}
}
sum+=numerator/denominator;
}
knot[i]=sum;
}
}