vb.net的b样条曲线,b样条曲线函数

什么是b样条曲线

在数学的子学科数值分析里,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中样条曲线问题

不引用的话,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样条曲线

画b样条曲线 1.执行“绘图/绘图网格/在屏幕上显示网格(注意数据设置)/确定”命令,使页面上显示绘图网格; 2.用“绘图”工具栏上的“箭头”画坐标轴,画时按住Shift键,保证画出的线水平、垂直; 3.用“直线”或“椭圆”画坐标轴上的刻度; 4.用“本框”制作数轴上数据标识; 6.用“椭圆”制作坐标点(画时按住Shift键)、用“直线”画点向坐标轴引的垂线、用“文本框”制作点的坐标。 7.用“绘图”工具栏上的“自选图形”制作函数图形

求VB下三次B样条曲线的算法原代码 十万火急求

#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);

}


本文名称:vb.net的b样条曲线,b样条曲线函数
转载源于:http://scyanting.com/article/hsesgs.html