.
计算机图形学实验报告
实验名称 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 文档