NURBS曲线曲面

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)ωii=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 ωi0,且顺序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 deBoorCox递推公式决定的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=0mj=0nNi,p(u)Nj,q(v)ωiji=0mj=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 ωij0且顺序 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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值