在数学的子学科数值分析里,B-样条是样条曲线一种特殊的表示形式。它是B-样条基曲线的线性组合。B-样条是贝兹曲线的一种一般化,可以进一步推广为非均匀有理B样条(NURBS),使得我们能给更多一般的几何体建造精确的模型。
创新互联建站服务项目包括诸城网站建设、诸城网站制作、诸城网页制作以及诸城网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,诸城网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到诸城省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
定义
给定m+1 个节点ti ,分布在[0,1]区间,满足
一个n次B样条是一个参数曲线:
它由n次B样条基(basis B-spline)组成
.
Pi称为控制点或de Boor点. 多边形可以通过把de Boor点用线连起来构造出来,从P0开始,到Pn结束。这样的多边形称为de Boor多边形.
m+1个n次B样条基可以用Cox-de Boor递归公式 定义
当节点等距,称B样条为均匀(uniform)否则为非均匀(non-uniform)。
[编辑] 均匀B样条
当B样条是均匀的时候,对于给定的n,每个B样条基是其他基的平移拷贝而已。一个可以作为替代的非递归定义是
满足
满足
其中
(ti �6�1 t) +
是截断幂函数(truncated power function)
慢慢死去的方式。
既不预兆什么,也不暗示。
当男人从情人那里走出来时,她站在门口……
与我同煎熬、共患难,跟我一样思想的众灵魂呵——
可有凡世女子抵得这漩涡急流?
的么于这个的哈哈
不引用的话,VB做不到。这事情要看VB的版本。如果是6.0的话,要去网上下载GDIPLUS的库文件或者自己声明GDI+的API。如果是VB.NET的话,VB自带GDI+,但是也可以下载GDIPLUS库来用。如果不知道去哪里下载,我下载有,你可以问我要。我使用VB6.0。下载gdiplus以后,在VB里面引用这个库,注意要选择“所有文件”才能看到这个库。gdi+里面的path功能可以实现样条:Private
TOKEN
As
Long'GDI+对象
Private
Graphics
As
Long'画板
Private
Sub
InitGDIPlus()
'初始化GDI+
Dim
uInput
As
GdiplusStartupInput
uInput.GdiplusVersion
=
1
If
GdiplusStartup(TOKEN,
uInput)
Ok
Then
'初始化错误
MsgBox
"GDI+
初始化错误。程序即将关闭。",
vbCritical,
"InitError"
End
End
If
GdipCreateFromHDC
Me.hDC,
Graphics'创建画板
GdipSetSmoothingMode
Graphics,
SmoothingModeAntiAlias'设置为反锯齿
End
SubPrivate
Sub
TerminateGDIPlus()
GdipDeleteGraphics
Graphics
'释放graphics占用的内存
GdiplusShutdown
TOKEN
'关闭GDI+
End
SubPrivate
Sub
Form_Load()
InitGDIPlus
'初始化End
SubPrivate
Sub
Command1_Click()
Dim
path
As
Long
Dim
m(3)
As
POINTF
'以下是坐标,你可以自由改变
m(0).x
=
m(0).y
=
m(1).x
=
10
m(1).y
=
100
m(2).x
=
20
m(2).y
=
3
m(3).x
=
500
m(3).y
=
100
Dim
pen
As
Long
GdipCreatePen1
HFF000000,
2,
UnitPixel,
pen
'创建画笔,用来画出样条
GdipCreatePath
FillModeAlternate,
path
'创建path
GdipAddPathBeziers
path,
m(0),
4
'创建样条'Count是说坐标的个数,points只能传递数组的第一个元素,不能传递数组。
GdipDrawPath
Graphics,
pen,
path
'画出样条
GdipDeletePen
pen
'删除画笔
GdipDeletePath
path
'删除样条End
SubPrivate
Sub
Form_Unload(Cancel
As
Integer)
TerminateGDIPlus
'删除GDI+
End
Sub
画b样条曲线 1.执行“绘图/绘图网格/在屏幕上显示网格(注意数据设置)/确定”命令,使页面上显示绘图网格; 2.用“绘图”工具栏上的“箭头”画坐标轴,画时按住Shift键,保证画出的线水平、垂直; 3.用“直线”或“椭圆”画坐标轴上的刻度; 4.用“本框”制作数轴上数据标识; 6.用“椭圆”制作坐标点(画时按住Shift键)、用“直线”画点向坐标轴引的垂线、用“文本框”制作点的坐标。 7.用“绘图”工具栏上的“自选图形”制作函数图形
#define BEZ_N 10
#includegraphics.h
#include stdlib.h
#include stdio.h
#includeconio.h
#includemath.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;iB_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_maxd)
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;iBEZ_N;++i)
{
if(i3)
{ 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;iB_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);
}