好文档 - 专业文书写作范文服务资料分享网站

Bezier曲线和样条曲线的生成算法

天下 分享 时间: 加入收藏 我要投稿 点赞

.

计算机图形学实验报告

实验名称 Bezier曲线和样条曲线的生成算法 评分 实验日期 年 月 日 指导教师 专业班级 学号

一、 实验目的

1、 复习Bezier曲线和B样条曲线的参数表示法。 2、 编程实现用二次Bezier曲线绘制。

3、 编程实现用三次Bezier曲线绘制和分段光滑Bezier曲线图形的绘制。 4、 用三次B样条函数绘制曲线。

二、 实验要求

1、编程实现在屏幕上绘制出两次Bezie曲线的几何图形和特征多边形图形,对于直线和曲线设置不同的线形和颜色。

2、现在屏幕上绘制出三次Bezie曲线的几何图形和特征多边形图形,对于直线和曲线设置不同的线形和颜色。

1、编程实现用分段三次Bezier曲线绘制光滑Bezier曲线图形。 1、 编程实现在屏幕上绘制出三次B样条函数绘制曲线。 2、 编程实现在屏幕上绘制出光滑连接的三次B样条曲线。

三、 关键算法及实现原理

1、二次Bezier曲线的计算公式为: P(t)=(P0-2P1+P2)t+(-2P0+2P1)t+P0 X(t)=(X0-2X1+X2)t+(-2X0+2X1)t+X0 Y(t)=(Y0-2Y1+Y2)t+(-2Y0+2Y1)t+Y0

其中P0、P1、P2为三个已知的点,坐标分别为(X0、Y0)、(X1、Y1)、(X1、Y2)。 2、 次Bezier曲线的计算公式为:

P(t)=(-P0+3P1-3P2+P3)t+(3P0-6P1+3P2)t+(-3P0+3P1)t+P0

3

2

222

Word 文档

.

X(t)= (-X0+3X1-3X2+X3)t+(3X0-6X1+3X2)t+(-3X0+3X1)t+X0 Y(t)= (-Y0+3Y1-3Y2+Y3)t+(3Y0-6Y1+3Y2)t+(-3Y0+3Y1)t+Y0

其中P0、P1、P2、P3为四个已知的点,坐标分别为(X0、Y0)、(X1、Y1)、(X1、Y2) 、(X3、Y3)。 3、三次B样条函数绘制曲线的计算公式为:

P(t)=[(-P0+3P1-3P2+3P3)t+(3P0-6P1+3P2)t+(-3P0+3P2)t+(P0+4P1+P2)]/6 X(t)=[(-X0+3X1-3X2+3X3)t+(3X0-6X1+3X2)t+(-3X0+3X2)t+(X0+4X1+X2)]/6 Y(t)=[(-Y0+3Y1-3Y2+3Y3)t+(3Y0-6Y1+3Y2)t+(-3Y0+3Y2)t+(Y0+4Y1+Y2)]/6

其中P0、P1、P2、P3为四个已知的点,坐标分别为(X0、Y0)、(X1、Y1)、(X1、Y2) 、(X3、Y3)。 4、三次B样条函数绘制曲线的光滑连接条件为:对于N个顶点,取P1、P2、P3、P4 4个顶点绘制在第一段三次样条曲线,再取P2、P3、P4 、P5 4个顶点绘制在第二段三次样条曲线,总计可绘制n-3段光滑连接的三次样条曲线。

5、程序设计方法

根据Bezier曲线的定义,输入Bezier曲线的特征多边形(例如三次Bezier曲线输入四个型值点),然后把t从0~1分成n等分,按相应的Bezier曲线公式计算出Bezier曲线上的点,用绘直线段的方法依次这些点连接起来,就得到Bezier曲线。如果要画多段Bezier曲线,可设置一些变量存放Bezier曲线的条数,按条数依次绘制出来即可。

3

2

3

2

3

2

3

2

32

四、程序调试中的问题

1、注意选项中路径要改。

2、在turboc2中加载displaytou头文件

五、程序运行结果或数据

1、绘制二次 Bezier 曲线的源程序

#include \

void Bezier_2(int color,double p[3][2]) { double t,xt,yt; int rate=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;

Word 文档

.

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

void main(void)

{ static double p[3][2]={50,400,340,20,635,420}; const N0=3; int i;

Initialize(); setcolor(WHITE); moveto(p[0][0],p[0][1]);

for (i=1;i

2、实现光滑连接的三次 B-样条曲线源程序 #include\#include\#include

void B_yt_3(int [][2],int color,int tzb); void tulie(int,int,int); void xuehaopri(int color); void main()

{int gdriver=DETECT,gmode;

int p[8][2]={{30,350},{90,110},{250,260},{390,90},{490,110}, {530,370},{600,230},{550,110}};

initgraph(&gdriver,&gmode,\

Word 文档

.

xuehaopri(14); tulie(2,4,15); B_yt_3(p,4,0); getch(); closegraph(); }

void B_yt_3(int p[][2],int color,int tzb) { float t=0; int xt,yt,i,m; setlinestyle(0,0,1); setcolor(15); delay(1000); if(tzb==1) for(i=0;i<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;t<=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); }

Word 文档

.

}

void xuehaopri(int color) {

setcolor(color); settextstyle(1,0,3); settextjustify(1,1);

outtextxy(getmaxx()/2,15,\}

void tulie(int color1,int color2,int textcolor) {

int x=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,\}

Word 文档

.

六、实验收获及体会

1、 了解Bezier曲线和B样条曲线的参数表示法。

2、 用三次Bezier曲线绘制和分段光滑Bezier曲线图形的绘制。 3、 了解二次bezier曲线和三次bezier曲线的算法。

Word 文档

Bezier曲线和样条曲线的生成算法

.计算机图形学实验报告实验名称Bezier曲线和样条曲线的生成算法评分实验日期年月日指导教师专业班级学号<
推荐度:
点击下载文档文档为doc格式
6dubg3w5fh6c4rp7oypx5gf8x599m300sut
领取福利

微信扫码领取福利

微信扫码分享