Bezier曲线和样条曲线的生成算法Word文档下载推荐.doc
《Bezier曲线和样条曲线的生成算法Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《Bezier曲线和样条曲线的生成算法Word文档下载推荐.doc(6页珍藏版)》请在冰点文库上搜索。
2、编程实现在屏幕上绘制出光滑连接的三次B样条曲线。
三、关键算法及实现原理
1、二次Bezier曲线的计算公式为:
P(t)=(P0-2P1+P2)t2+(-2P0+2P1)t+P0
X(t)=(X0-2X1+X2)t2+(-2X0+2X1)t+X0
Y(t)=(Y0-2Y1+Y2)t2+(-2Y0+2Y1)t+Y0
其中P0、P1、P2为三个已知的点,坐标分别为(X0、Y0)、(X1、Y1)、(X1、Y2)。
2、次Bezier曲线的计算公式为:
P(t)=(-P0+3P1-3P2+P3)t3+(3P0-6P1+3P2)t2+(-3P0+3P1)t+P0
X(t)=(-X0+3X1-3X2+X3)t3+(3X0-6X1+3X2)t2+(-3X0+3X1)t+X0
Y(t)=(-Y0+3Y1-3Y2+Y3)t3+(3Y0-6Y1+3Y2)t2+(-3Y0+3Y1)t+Y0
其中P0、P1、P2、P3为四个已知的点,坐标分别为(X0、Y0)、(X1、Y1)、(X1、Y2)、(X3、Y3)。
3、三次B样条函数绘制曲线的计算公式为:
P(t)=[(-P0+3P1-3P2+3P3)t3+(3P0-6P1+3P2)t2+(-3P0+3P2)t+(P0+4P1+P2)]/6
X(t)=[(-X0+3X1-3X2+3X3)t3+(3X0-6X1+3X2)t2+(-3X0+3X2)t+(X0+4X1+X2)]/6
Y(t)=[(-Y0+3Y1-3Y2+3Y3)t3+(3Y0-6Y1+3Y2)t2+(-3Y0+3Y2)t+(Y0+4Y1+Y2)]/6
4、三次B样条函数绘制曲线的光滑连接条件为:
对于N个顶点,取P1、P2、P3、P44个顶点绘制在第一段三次样条曲线,再取P2、P3、P4、P54个顶点绘制在第二段三次样条曲线,总计可绘制n-3段光滑连接的三次样条曲线。
5、程序设计方法
根据Bezier曲线的定义,输入Bezier曲线的特征多边形(例如三次Bezier曲线输入四个型值点),然后把t从0~1分成n等分,按相应的Bezier曲线公式计算出Bezier曲线上的点,用绘直线段的方法依次这些点连接起来,就得到Bezier曲线。
如果要画多段Bezier曲线,可设置一些变量存放Bezier曲线的条数,按条数依次绘制出来即可。
四、程序调试中的问题
1、注意选项中路径要改。
2、在turboc2中加载displaytou头文件
五、程序运行结果或数据
1、绘制二次Bezier曲线的源程序
#include"
display.h"
voidBezier_2(intcolor,doublep[3][2])
{doublet,xt,yt;
intrate=200,x,y;
setcolor(color);
moveto(p[0][0],p[0][1]);
for(t=0;
t<
=1;
t+=1.0/rate)
{yt=1-t;
xt=p[0][0]*yt*yt+p[1][0]*2*yt*t+p[2][0]*t*t;
yt=p[0][1]*yt*yt+p[1][1]*2*yt*t+p[2][1]*t*t;
x=(int)(xt);
y=(int)(yt);
lineto(x,y);
}
}
voidmain(void)
{staticdoublep[3][2]={50,400,340,20,635,420};
constN0=3;
inti;
Initialize();
setcolor(WHITE);
for(i=1;
i<
N0;
i++)lineto(p[i][0],p[i][1]);
Bezier_2(LIGHTRED,p);
while(getch()!
=ESC);
closegraph();
2、实现光滑连接的三次B-样条曲线源程序
#include"
graphics.h"
conio.h"
#include<
dos.h>
voidB_yt_3(int[][2],intcolor,inttzb);
voidtulie(int,int,int);
voidxuehaopri(intcolor);
voidmain()
{intgdriver=DETECT,gmode;
intp[8][2]={{30,350},{90,110},{250,260},{390,90},{490,110},
{530,370},{600,230},{550,110}};
initgraph(&
gdriver,&
gmode,"
D:
\\tc\\bgi"
);
xuehaopri(14);
tulie(2,4,15);
B_yt_3(p,4,0);
getch();
closegraph();
voidB_yt_3(intp[][2],intcolor,inttzb)
{
floatt=0;
intxt,yt,i,m;
setlinestyle(0,0,1);
setcolor(15);
delay(1000);
if(tzb==1)
for(i=0;
7;
i++)
line(p[i][0],p[i][1],p[i+1][0],p[i+1][1]);
setcolor(color);
for(m=0;
m<
5;
m++)
for(t=0;
=1.0;
t+=0.01)
xt=1.0/6*((-p[m][0]+3*p[m+1][0]-3*p[m+2][0]+p[m+3][0])*t*t*t+
(3*p[m][0]-6*p[m+1][0]+3*p[m+2][0])*t*t+
(-3*p[m][0]+3*p[m+2][0])*t+(p[m][0]+4*p[m+1][0]+p[m+2][0]));
yt=1.0/6*((-p[m][1]+3*p[m+1][1]-3*p[m+2][1]+p[m+3][1])*t*t*t+
(3*p[m][1]-6*p[m+1][1]+3*p[m+2][1])*t*t+
(-3*p[m][1]+3*p[m+2][1])*t+(p[m][1]+4*p[m+1][1]+p[m+2][1]));
if(t==0)moveto(xt,yt);
lineto(xt,yt);
delay(15);
voidxuehaopri(intcolor)
settextstyle(1,0,3);
settextjustify(1,1);
outtextxy(getmaxx()/2,15,"
MadeByNo.010XXX"
voidtulie(intcolor1,intcolor2,inttextcolor)
intx=getmaxx()/2,y=getmaxy()-20;
moveto(x-180,y);
setcolor(color1);
setlinestyle(0,0,3);
lineto(x-155,y);
setcolor(color2);
moveto(x,y);
lineto(x+25,y);
setcolor(textcolor);
settextstyle(0,0,1);
outtextxy(x-80,y,"
2ciB_yangtiao"
六、实验收获及体会
1、了解Bezier曲线和B样条曲线的参数表示法。
2、用三次Bezier曲线绘制和分段光滑Bezier曲线图形的绘制。
3、了解二次bezier曲线和三次bezier曲线的算法。