‘壹’ b样条曲线是在什么数学里讲的
书名不清楚..不过在网上找到这个..不知道你用不用得上.
五、B样条曲线的矩阵表示
1)二阶B样条曲线
设空间P0 P1, …., Pn为n+1个控制点,节点矢量为 其中每相邻两个控制点之间可以构造出一段二阶B样条曲线。其中的第j=i-1段二阶B样条曲线Pj(t)的矩阵表示为:
;
其中, 。
对于二阶均匀B样条曲线,其矩阵表示与非均匀B样条曲线的相同:
。
2)三阶B样条曲线
给定节点矢量为 ,n+1个控制点为P0,P1, …., Pn。其中每相邻三个点可构造出一段二次的B样条曲线。其中的第j(=i-2)段三阶B样条曲线Pj(u)的矩阵表示为:
;
其中,
。
对于三阶均匀B样条曲线,其矩阵表示为
。
三阶均匀B样条曲线的端点位置、一阶导数和二阶导数矢量分别为:
Pi,3(0)=(Pi+Pi+1)/2,
Pi,3(1)=(Pi+1+Pi+2)/2;
P'i,3(0)= Pi+1-Pi,
P'i,3(1)=Pi+2-Pi+1,
P'i,3(1)=P'i+1,3(0);
P''i,3(t)=Pi-2Pi+1+Pi+2 ,
三阶均匀B样条曲线的首末点通过相应边的中点;首末点的切矢方向与相应边重合;二阶导数矢量等于该曲线的两条边矢量Pi+1-Pi 和Pi+2-Pi+1所构成的对角线矢量。
三阶均匀B样条曲线段为抛物线,两相邻曲线段之间为一阶连续。
3)四阶B样条曲线
设节点矢量为 ,控制点为P0 P1, …., Pn,其中每相邻四个点可构造出一段三次的B样条曲线。其中的第j(=i-3)段三次B样条曲线Pi(u)的矩阵表示为:
;。
其中,
,
m3,2 =-m2,2/3- m3,3-(ti+1-ti)2/[( ti+2-ti)(ti+2-ti-1)],mr,j是第r行第j列的元素。
第j(=i-3)段三次均匀B样条曲线Pj(t)的矩阵表示:
。
三次均匀B样条曲线的端点位置、一阶导数和二阶导矢量分别为:
Pi,4(0)=(Pi+4Pi+1+Pi+2)/6,
Pi,4(1)=(Pi+1+4Pi+2+Pi+3)/6;
P'i,4(0)=(Pi+2-Pi )/2,
P'i,4(1)= (Pi+3-Pi+1 )/2,
P'i,3(1)= P'i+1,3(0);
P''i,4(0)= Pi-2Pi+1+ Pi+2,
P'i,4(1)= Pi+1-2Pi+2+ Pi+3。
三次均匀B样条曲线段的起点位于以Pj+1Pj和Pj+1Pj+2为邻边的平行四边形的对角线的1/6处;起点的切矢量与PjPj+2平行,切矢量的长度 ;曲线段起点的二阶导数矢量等于以Pj+1Pj和Pj+1Pj+2为邻边所构成的平行四边形的对角线矢量。
4)k阶B样条曲线
设节点矢量为 ,控制点为P0,P1, …., Pn,其中每相邻k个控制点可构造出一段k阶B样条曲线。其中的第j(=i-k+1)段曲线Pi-k+1(u)的矩阵表示为:
(6-4-4)
;
;
其中,Mk(i)称为k阶B样条基矩阵,它由下列递归公式计算:
(6-4-5)
如果 ,i=0,1,…,n+k-1,则由(6-4-4)式所定义的曲线Pi-k+1(u) (i=k-1, k,…,n)为均匀B样条曲线,这时,k阶B样条基矩阵Mk(i)与i无关,简记为Mk:
上式也可以显式地表示为:
其中,
。
这里面也有一个.
http://baby66.bokee.com/3678017.html
希望给对你有所帮助.
‘贰’ 三次均匀B样条插值算法
三次样条插值(Cubic Spline Interpolation)简称Spline插值,是通过一系列形值点的一条光滑曲线,数学上通过求解三弯矩方程组得出曲线函数组的过程。
实际计算时还需要引入边界条件才能完成计算。一般的计算方法书上都没有说明非扭结边界的定义,但数值计算软件如Matlab都把非扭结边界条件作为默认的边界条件。
‘叁’ 求VB下三次B样条曲线的算法原代码 十万火急求
#define BEZ_N 10
#include<graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include<conio.h>
#include<math.h>
//int control[4][2]={20,20,100,100,300,100,500,20};
double p0[BEZ_N][2];
double p1[4][2]={10.0,10.0,200.0,100.0,250.0,400.0,600.0,100.0};
int midx,midy,B_N,B_N1;
char RET='a';
curve_split(double p[BEZ_N][2], double q[BEZ_N][2],double r[BEZ_N][2])
{
int i,j;
for(i=0;i<=B_N;++i)
{
q[i][0]=p[i][0]; q[i][1]=p[i][1];
}
for(i=1;i<=B_N;++i)
{
r[B_N+1-i][0]=q[B_N][0]; r[B_N+1-i][1]=q[B_N][1];
for(j=B_N;j>=i;--j)
{
/* line(q[j][0]+midx,midy-q[j][1],q[j-1][0]+midx,midy-q[j-1][1]);
RET=getch();
if(RET=='e')
return(0);*/
q[j][0]=(q[j-1][0]+q[j][0])/2;
q[j][1]=(q[j-1][1]+q[j][1])/2;
}
}
r[0][0]=q[B_N][0]; r[0][1]=q[B_N][1];
return(0);
}
double dd(double ax,double ay,double bx,double by,double cx,double cy)
{
double d,k,A,B,C,AB;
k=(by-cy)/(bx+cx);
A=k;B=1;C=-(k*bx+by);
AB=sqrt(A*A+B*B);
d=fabs(A*ax+ay+C)/AB;
return(d);
}
max_d(double p[BEZ_N][2])
{
double d,d_max=0.0;
int i,j;
for(i=1;i<B_N;++i)
{
d=dd(p[i][0],p[i][1],p[0][0],p[0][1],p[B_N][0],p[B_N][1]);
if(d_max<d)
d_max=d;
}
return(d_max);
}
curve(double p[BEZ_N][2])
{
double d1,d2,d;
double q[BEZ_N][2],r[BEZ_N][2];
// if(RET=='e')
// return(0);
// d1=dd(p[1][0],p[1][1],p[0][0],p[0][1],p[2][0],p[2][1]);
if(max_d(p)<2)
{line(p[0][0]+midx,midy-p[0][1],p[B_N][0]+midx,midy-p[B_N][1]);
//getch();
}
else
{
curve_split(p,q,r);
curve(q);
curve(r);
}
return(0);
}
ini()
{
int i;
for(i=0;i<BEZ_N;++i)
{
if(i<3)
{ p0[i][0]=p1[i][0];p0[i][1]=p1[i][1];}
else
{ p0[i][0]=0.0;p0[i][1]=0.0;}
}
return(0);
}
main()
{
int gdriver=DETECT,gmode;
int x_max,y_max;
int x=1,y=1,i,j,col;
double p1[6][2]={10.0,10.0,100.0,200.0,200.0,220.0,250.0,230.0,300.0,200.0,400.0,10.0};
initgraph(&gdriver,&gmode,"");
midx = getmaxx()/16;
midy = getmaxy();
// ini();
/* printf("\n input number of control pot");
scanf("%d",&B_N);
B_N1=B_N+1;
for(i=0;i<=B_N;++i)
{
printf("\n P%d(x,y)",i);
scanf("%d%d",&x,&y);
p0[i][0]=x;p0[i][1]=y;
} */
B_N=5;
for(i=0;i<=B_N;++i)
{
p0[i][0]=p1[i][0];p0[i][1]=p1[i][1];
}
setcolor(15);
for(i=0;i<B_N;++i)
line((int)p0[i][0]+midx,midy-(int)p0[i][1],(int)p0[i+1][0]+midx,midy-(int)p0[i+1][1]);
setcolor(4);
if(getch()!='e')
curve(p0);
getch();
cleardevice();
closegraph();
return(0);
}