资源描述
计算机图形学实验报告实验名称 Bezier曲线和样条曲线的生成算法评分实验日期 年_月 _日指导教师 姓名 专业班级 学号 一、实验目的1、复习Bezier曲线和B样条曲线的参数表示法。2、编程实现用二次 Bezier曲线绘制。3、 编程实现用三次Bezier曲线绘制和分段光滑Bezier曲线图形的绘制。4、用三次B样条函数绘制曲线。二、实验要求1、 编程实现在屏幕上绘制出两次Bezie曲线的几何图形和特征多边形图形,对于直线和曲线设置不同的线形和颜色。2、 现在屏幕上绘制出三次Bezie曲线的几何图形和特征多边形图形,对于直线和曲线设置不同的线形和颜色。1、编程实现用分段三次 Bezier曲线绘制光滑 Bezier曲线图形。1、 编程实现在屏幕上绘制出三次B样条函数绘制曲线。2、 编程实现在屏幕上绘制出光滑连接的三次B样条曲线。三、关键算法及实现原理1、二次Bezier曲线的计算公式为:2P(t)=(P o-2P1+F2)t +(-2P o+2R)t+P o2X(t)=(X 0-2X1+X)t +(-2X 0+2X1 )t+Xo2Y(t)=(Y o-2Y1+Y)t +(-2Yo+2Y1)t+Yo其中Pd、P1、P2为三个已知的点,坐标分别为(Xo、Yo)、(X1、Y1)、(X1、Y2)。2、次Bezier曲线的计算公式为:P(t)=(-P o+3P-3P2+P3)t 3+(3Po-6P1+3F2)t 2+(-3P o+3R)t+P 0X(t)= (-X o+3X-3X2+X0t 3+(3Xo-6X1+3Xz)t 2+(-3X o+3%)t+X 032Y(t)= (-Y o+3Yi-3Y2+Y3)t +(3Yo-6Yi+3Y2)t +(-3Y o+3Yi)t+Y 0其中Po、Pl、巳、P3为四个已知的点,坐标分别为(X。、丫0)、(Xi、Y)、(Xi、Y2)、(X3、Y3)。3、三次B样条函数绘制曲线的计算公式为:P(t)=(-Po+3P-3P2+3P3)t 3+(3Po-6Pi+3P2)t 2+(-3P o+3P2)t+(P o+4P+F2)/632X(t)=(-X o+3Xi-3X2+3X3)t +(3Xo-6Xi+3X2)t +(-3X o+3Xz)t+(X o+4X+X0/632Y(t)=(-Y o+3Yi-3Y2+3Y3)t +(3Yo-6丫计3Y2)t +(-3Y o+3Y2)t+(Y o+4Y+W)/6其中Po、Pi、P2、P3为四个已知的点,坐标分别为(Xo、Yo)、(Xi、Y)、(Xi、Y2)、(X3、Y3)。4、 三次B样条函数绘制曲线的光滑连接条件为:对于N个顶点,取Pi、P2、P3、P4 4个顶点绘制在第一段三次样条曲线,再取P2、P3、P4、P5 4个顶点绘制在第二段三次样条曲线,总计可绘制n-3段光滑连接的三次样条曲线。5、程序设计方法根据Bezier曲线的定义,输入 Bezier曲线的特征多边形(例如三次 Bezier曲线输入 四个型值点),然后把t从01分成n等分,按相应的 Bezier曲线公式计算出 Bezier曲线 上的点,用绘直线段的方法依次这些点连接起来,就得到Bezier曲线。如果要画多段Bezier曲线,可设置一些变量存放 Bezier曲线的条数,按条数依次绘制出来即可。四、程序调试中的问题1、注意选项中路径要改。2、在turboc2 中加载displaytou 头文件五、程序运行结果或数据1、绘制二次Bezier曲线的源程序#i nclude display.hvoid Bezier_2(i nt color,double p32) double t,xt,yt;int rate=200,x,y;setcolor(color);moveto(p00,p01);for (t=0;t=1;t+=1.0/rate) yt=i-t;xt=p00*yt*yt+p10*2*yt*t+p20*t*t;yt=p01*yt*yt+p11*2*yt*t+p21*t*t;x=(i nt)(xt);y=(i nt)(yt);li neto(x,y);void mai n(void) static double p32=50,400,340,20,635,420;const N0=3;int i;In itialize();setcolor(WHITE);moveto(p00,p01);for (i=1;iN0;i+) lineto(pi0,pi1);Bezier_2(LIGHTRED,p);while (getch()!=ESC);closegraph();2、实现光滑连接的三次 B-样条曲线源程序#in cludegraphics.h#in cludec on io.h#in cludevoid B_yt_3(i nt 2,i nt color,i nt tzb);void tulie(i nt,i nt,i nt);void xuehaopri(i nt color);void mai n()int gdriver=DETECT,gmode;int p82=30,350,90,110,250,260,390,90,490,110,530,370,600,230,550,110;in itgraph( &gdriver, &gmode,D:tcbgi );xuehaopri(14);tulie(2,4,15);B_yt_3(p,4,0);getch();closegraph();void B_yt_3(i nt p2,i nt color,i nt tzb)float t=0;int xt,yt,i,m;setl in estyle(0,0,1);setcolor(15);delay(1000);if(tzb=1)for(i=0;i7;i+)lin e(pi0,pi1,pi+10,pi+11);setcolor(color);for(m=0;m5;m+)for(t=0;t=1.0;t+=0.01)xt=1.0/6*(-pm0+3*pm+10-3*pm+20+pm+30)*t*t*t+(3*pm0-6*pm+10+3*pm+20)*t*t+(-3*pm0+3*pm+20)*t+(pm0+4*pm+10+pm+20);yt=1.0/6*(-pm1+3*pm+11-3*pm+21+pm+31)*t*t*t+(3*pm1-6*pm+11+3*pm+21)*t*t+(-3*pm1+3*pm+21)*t+(pm1+4*pm+11+pm+21);if(t=0) moveto(xt,yt);lin eto(xt,yt);delay(15);void xuehaopri(i nt color)setcolor(color);settextstyle(1,0,3);sette xtju stify(1,1);outtextxy(getmaxx()/2,15,Made By No. 010XXX);void tulie(i nt color1,i nt color2,i nt textcolor)int x=getmaxx()/2,y=getmaxy()-20;moveto(x-180,y);setcolor(color1);setl in estyle(0,0,3);lin eto(x-155,y);setcolor(color2);moveto(x,y);lin eto(x+25,y);setcolor(textcolor);settextstyle(0,0,1);outtextxy(x-80,y,2 ci B_ya ngtiao);Brf?ak/ufttchFiile Edit Run Compile FFoMErtOpt 玄Deh*gB_yt_3int 2】,时 col叶”txh; tulie int. int xueJiaoppi,3BEZIEH.CConailing:EDITOR + 3BEZIER.cTotalFileLines compiled: 791?91Warnings: 00Eprors: &0Availablememory: 262KSuccess:Pressany kej/NUMFl-Help F-Zoon F6-Switch F7-Trace F8-Step F9-flake F10-ffenuEdi tLine 1 Col 1 Insert Ihdnt Tab Fill Unindent E:3BEZIER_C ttinc ludegraphic s. h1* ttincludelconio - W tt In eluded dos -h void void uo id uo id int int530,in itraphC&gdrivc xuehaopi!*i ;tulie2.4,15?; B_yt_3; etch ; c lQsej(i*apliC ;p 2F int color int tzb) IMtch六、实验收获及体会1、了解Bezier曲线和B样条曲线的参数表示法。2、 用三次Bezier曲线绘制和分段光滑Bezier曲线图形的绘制。3、 了解二次bezier曲线和三次bezier曲线的算法。
展开阅读全文