计算机图形学实验指导.pdf
- 文档编号:30839538
- 上传时间:2024-01-30
- 格式:PDF
- 页数:10
- 大小:55.45KB
计算机图形学实验指导.pdf
《计算机图形学实验指导.pdf》由会员分享,可在线阅读,更多相关《计算机图形学实验指导.pdf(10页珍藏版)》请在冰豆网上搜索。
计算机图形学实验指导书实验课程教学目的与要求:
掌握计算机图形的生成技术和生成各种平面图形和简单立体图形的基本算法,掌握图形填充、裁剪、图形变换及图形消隐等计算机图形处理的基本方法,初步掌握用C语言编写基本图形生成和处理程序的方法,为后续的课程奠定良好的基础。
实验1:
Bresenham算法的应用一、所需主要仪器及环境:
每人微机一台,安装Turboc2.0或者VC+二、实验目的和要求:
通过本次实验要求学生掌握DDA算法和Bresenham算法的基本原理和算法设计,并初步熟悉C/C+进行图形编程的方法。
三、实验主要内容:
实现绘制各种情况直线的Bresenham算法,并将实现的算法应用于任意多边形的绘制,要求多边形的顶点由键盘输入或鼠标拾取,绘制的多边形顶点要准确,图形应该封闭。
要求画出算法实现的程序流程图,使用C或者VC+实现算法,并演示。
四、参考实验步骤:
1)分析各种情况下直线绘制的方法,确定直线绘制的算法流程2)实现任意情况下的直线绘制算法,并测试该算法3)上述算法测试成功后,考虑使用上述算法按次序连接多边形的顶点来绘制多边形。
实例程序(这里只给出绘制个方向直线的中点Bresenham算法的参考代码,此代码为VC环境下使用,若要在C环境下使用,则需将程序中使用pDC-SetPixel()绘制点的函数调用改为putpixel(),注意大小写)voidBresenhamline(intx1,inty1,intx2,inty2)/对于所有直线均按照从左至右的方向绘制if(x1x2)inttempx,tempy;tempx=x1;x1=x2;x2=tempx;tempy=y1;y1=y2;y2=tempy;/根据斜率的情况不同而绘制if(y1=y2)/斜率为0的情况for(x=x1;xSetPixel(x,y1,2);elseif(x1=x2)/直线为垂直的情况if(y1y2)/使直线按从下往上画inttempy=y1;y1=y2;y2=tempy;for(y=y1;ySetPixel(x1,y,2);elsedy=y2-y1;dx=x2-x1;if(abs(dy)=abs(dx)/斜率为1或-1时x=x1;y=y1;if(dy=y2;y-)x+;pDC-SetPixel(x,y,2);/斜率为1else/斜率为-1for(;ySetPixel(x,y,2);/斜率为-1elseif(abs(dy)0&dx0)/斜率为正时right=-2*dy;rightleft=2*dx-2*dy;d=dx-2*dy;x=x1;y=y1;while(xSetPixel(x,y,2);x+;if(d0)y+;d=d+rightleft;elsed=d+right;/斜率为正时else/斜率为负时right=2*dy;rightleft=2*dy-2*dx;d=2*dy-dx;x=x1;y=y1;while(xSetPixel(x,y,2);x+;if(d0&dx0)/斜率为正时right=2*dx;rightleft=2*dx-2*dy;d=2*dx-dy;x=x1;y=y1;while(ySetPixel(x,y,2);y+;if(d=0)x+;d=d+rightleft;elsed=d+right;/斜率为正时else/斜率为负时right=-2*dx;rightleft=-2*dx-2*dy;d=-2*dx-dy;x=x1;y=y1;while(y=y2)pDC-SetPixel(x,y,2);y-;if(dnext;while(p!
=NULL)if(edge-xIntersectxIntersect)p=NULL;elseq=p;p=p-next;edge-next=q-next;q-next=edge;intyNext(intk,intcnt,dePt*pts)intj;if(k+1)(cnt-1)j=0;elsej=k+1;while(ptsk.y=ptsj.y)if(j+1)(cnt-1)j=0;elsej+;return(ptsj.y);voidmakeEdgeRec(dePtlower,dePtupper,intyComp,Edge*edge,Edge*edges)edge-dxPerScan=(float)(upper.x-lower.x)/(upper.y-lower.y);edge-xIntersect=lower.x;if(upper.yyUpper=upper.y-1;elseedge-yUpper=upper.y;insertEdge(edgeslower.y,edge);voidbuildEdgeList(intcnt,dePt*pts,Edge*edges)Edge*edge;dePtv1,v2;inti,yPrev=ptscnt-2.y;v1.x=ptscnt-1.x;v1.y=ptscnt-1.y;for(i=0;icnt;i+)v2=ptsi;if(v1.y!
=v2.y)edge=(Edge*)malloc(sizeof(Edge);if(v1.ynext;while(p)q=p-next;insertEdge(active,p);p=q;voidfillScan(intscan,Edge*active)Edge*p1,*p2;inti;p1=active-next;while(p1)p2=p1-next;for(i=p1-xIntersect;ixIntersect;i+)putpixel(int)i,scan,3);p1=p2-next;voiddeleteAfter(Edge*q)Edge*p=q-next;q-next=p-next;free(p);voidupdateActiveList(intscan,Edge*active)Edge*q=active,*p=active-next;while(p)if(scan=p-yUpper)p=p-next;deleteAfter(q);elsep-xIntersect=p-xIntersect+p-dxPerScan;q=p;p=p-next;voidresortActiveList(Edge*active)Edge*q,*p=active-next;active-next=NULL;while(p)q=p-next;insertEdge(active,p);p=q;voidscanFill(intcnt,dePt*pts)Edge*edges1024,*active;inti,scan;for(i=0;inext=NULL;buildEdgeList(cnt,pts,edges);active=(Edge*)malloc(sizeof(Edge);active-next=NULL;for(scan=0;scannext)fillScan(scan,active);updateActiveList(scan,active);resortActiveList(active);实验3:
关于任意直线的图形对称变换一、所需主要仪器及环境:
每人微机一台,安装Turboc2.0或者VC+二、实验目的和要求:
通过本次实验要求学生掌握基本二维变换的工作原理,并能使用基本二维变换构造复杂变换以解决实际应用问题。
三、实验主要内容:
实验要求输入的直线是任意直线,直线的端点只能由键盘输入或者鼠标拾取,要做对称变换的图形也是一个任意图形(至少应是一个任意多边形)。
实验要求掌握算法的基本原理和算法设计,画出算法实现的程序流程图,使用C或者VC+实现算法,并演示。
四、参考实验步骤:
实现对称变换,分析如何使用一系列简单变换来构造题目要求的复合变换。
本题要实现的变换可以用如下一组变换组合来实现:
将直线任一点移至与坐标原点重合将平移后的直线绕原点旋转至与某一坐标轴重合将题目要求的对称变换转为实现已知图形关于上述坐标轴的对称变换按逆序求上述、变换的逆变换将上述矩阵依次相乘得到最终的复合变换矩阵则某一多边形关于任意直线的对称变换就转变为将该多边形的各顶点与上述求得的复合变换进行矩阵乘法,求得变换后的新多边形的各个顶点坐标。
1)根据上述流程,编程实现,并测试程序功能。
实例程序(对称变换最终转换为矩阵乘法来实现,可参考C语言的有关例程。
这里只给出Cohen-Sutherland编码裁剪算法实现的参考程序,其中的直线和窗口的绘制请参考实验1种的直线绘制算法)#defineLEFT1#defineRIGHT2#defineBOTTOM4#defineTOP8voidencode(floatx,floaty,int*code)intc=0;if(xXR)c=c|RIGHT;if(yYT)c=c|TOP;*code=c;voidC_S_Line_Clip(x1,y1,x2,y2,XL,XR,YB,YT)floatx1,y1,x2,y2,XL,XR,YB,YT;intcode1,code2,code;floatx=0,y=0;encode(x1,y1,&code1);encode(x2,y2,&code2);while(code1!
=0|code2!
=0)if(code1&code2)!
=0)return;code=code1;if(code1=0)code=code2;if(LEFT&code)!
=0)x=XL;y=y1+(y2-y1)*(XL-x1)/(x2-x1);elseif(RIGHT&code)!
=0)x=XR;y=y1+(y2-y1)*(XR-x1)/(x2-x1);elseif(BOTTOM&code)!
=0)y=YB;x=x1+(x2-x1)*(YB-y1)/(y2-y1);elseif(TOP&code)!
=0)y=YT;x=x1+(x2-x1)*(YT-y1)/(y2-y1);if(code=code1)x1=x;y1=y;encode(x,y,&code1);elsex2=x;y2=y;encode(x,y,&code2);Bresenhamline(x1,y1,x2,y2);/实验一中实现的直线绘制程序实验4:
实现直线和多边形裁剪一、所需主要仪器及环境:
每人微机一台,安装Turboc2.0或者VC+二、实验目的和要求:
通过本实验要求学生熟悉Cohen-Sutherland二维编码裁剪算法的基本原理和工作流程,并设计算法程序以加深对算法的理解。
本实验要求实现标准矩形窗口的裁剪,窗口由键盘输入确定,直线/多边形都是任意的。
裁剪后的图形要准确,不能多或者少点。
三、实验主要内容:
实验要求输入的直线是任意直线,直线的端点只能由键盘输入或者鼠标拾取,要做对称变换的图形也是一个任意图形(至少应是一个任意多边形)。
本实验要求掌握算法的基本原理和算法设计,画出算法实现的程序流程图,使用C或者VC+实现算法,并演示。
四、参考实验步骤:
分析直线裁减算法原理,设计算法流程。
以Cohen-Sutherland编码裁剪为例,算法的流程如下:
实验5:
Beizer曲线与B样条曲线的生成(选做)一、所需主要仪器及现有套数:
每人微机一台,安装Turboc2.0或者VC+二、实验目的和要求:
通过本次实验,要求学生熟悉并掌握Beizer曲线和B样条曲线的性质和生成算法,利用熟悉的计算机语言绘制一条曲线。
三、实验主要内容:
完成Beizer曲线、B样条曲线的生成显示。
给出Beizer曲线的全局控制性的演示图。
四、参考实验步骤:
1)利用Beizer曲线的定义来实现P(u)=PiBi,n(u)Bi,n(u)=C(n,i)ui(1-u)n-iC(n,i)=n!
/(i!
(n-i)!
)2)根据上述定义,编程实现,并测试程序功能。
实例参考程序doublepowi(doublev,intk)doubletemp=1.0;if(k=0)|(v=0)return1;elsefor(inti=1;ik;i+)temp=temp*v;returntemp;longfac(intm)inti;longtemp=1;if(m=0)return1;elsefor(i=2;im;i+)temp=temp*i;returntemp;voidBeizer(POINT*p,intn)intx,y,I,j,k=100;doublet=1.0/k,t1,u,v;doubletemp,temp1,temp2,bi;moveto(p0.x,p0.y);for(j=1;jk;j+)t1=j*t;u=t1;v=1-u;x=0;y=0;for(i=0;i=n;i+)temp=double(fac(n)/fac(i)/fac(n-i);temp1=powi(u,i);temp2=powi(v,n-i);bi=temp*temp1*temp2;x=x+bi*pi.x;y=y+bi*pi.y;lineto(x,y);lineto(pn.x,pn.y);3)根据B次样条曲线的定义,利用插值法绘制。
4)根据上述定义,编程实现,并测试程序功能。
实例参考程序voidCardinalspline(POINT*p,intn,floattension)intx,y,i,j,k=1000;doublet,t1,t2,t3,a,b,c,d,s;t=1.0/k;s=(1.0-tension)/2.0;pn.x=2*pn-1.x-pn-2.x;pn.y=2*pn-1.y-pn-2.y;moveto(p1.x;p1.y);for(i=1;in-1;i+)for(j=1;j=k;j+)t1=j*t;t2=t1*t1;t3=t2*t1;a=-s*t3+2*s*t2-s*t1;b=(2-s)*t3+(s-3)*t2+1;c=(s-2)*t3+(3-2*s)t2+s*t1;d=s*t3-s*t2;x=(int)(a*pi-1.x+b*pi.x+c*pi+1.x+d*pi+2.x);y=(int)(a*pi-1.y+b*pi.y+c*pi+1.y+d*pi+2.y);lineto(x,y);voidmain()intn=5,gdriver=DETECT,gmode;POINTps4;ps0.x=50;ps0.y=300;ps1.x=50;ps1.y=300;ps2.x=150;ps2.y=50;ps3.x=250;ps3.y=300;ps4.x=350;ps4.y=50;initgraph(&gdriver,&gmode,“”);Cardinalspline(ps,n,0.5);getch();closegraph();实验6:
设计一个简单的图形系统(选做)一、所需主要仪器及现有套数:
每人微机一台,安装Turboc2.0或者VC+二、实验目的和要求:
应用所学图形学知识开发简单图形系统,以加深对所学算法的理解及其在实际环境中的应用。
本实验对学生要求较高,学生至少应该能够明确程序的流程,并能将前面几次实验的成果融合到本系统中。
三、实验主要内容及要求:
可以使用MFC类库编程实现,或者将前述几次实验的算法封装成类再结合MFC编程实现。
要求该图形系统要能绘制简单的图形(直线、圆、多边形等),并能实现图形的拖放,缩放,简单的图形变换以及简单的交互式绘图。
四、参考实验步骤:
1)确定系统功能,划分功能模块2)确定各主要功能模块的算法,如果使用前几次实验的结果,则需考虑如何修改前几次实验的算法,并对他们进行封装(封装成类)3)确定系统的布局(工作区、工具栏、菜单等),设计工具栏及菜单4)确定消息响应机制,确定菜单中绘图命令及工具栏的响应函数,同时确定各函数的内部算法5)编程实现上述功能,注意每添加一个功能就应测试一次程序。
参考书籍:
1陈传波,陆枫主编,计算机图形学基础,电子工业出版社,2002年3月;2孙家广等编,计算机图形学(第三版),清华大学出版社,1998年9月;3孙立镌编著,计算机图形学,哈尔滨工业大学出版社,2000年5月;4唐荣锡等编,计算机图形学教程,科学出版社,2000年5潘云鹤编,计算机图形学,高等教育出版社,2000年
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 指导