计算机图形学实验报告-Cohen-Sutherland线裁剪算法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

班级R数学111大连交通大学姓名实验报告同组人课程名称:计算机图形学成绩实验名称:Cohen-Sutherland线裁剪算法指导老师实验目的、要求:通过上机实践,更好地掌握Cohen-Sutherland线裁剪算法实验仪器:PC机、VC6.0实验步骤、内容:菜单消息响应函数(注意:绿色背景色字体的代码在实验报告中不用写)辅助函数代码:#includemath.hinlineintround(constfloata){returnint(a+0.5);}//取整voidDDAline(intx0,inty0,intxEnd,intyEnd,CDC*pDC)//DDA画线,用于裁剪算法中线输出{intdx=xEnd-x0,dy=yEnd-y0,steps,k;floatxIncrement,yIncrement,x=x0,y=y0;if(fabs(dx)fabs(dy))steps=fabs(dx);elsesteps=fabs(dy);xIncrement=float(dx)/float(steps);yIncrement=float(dy)/float(steps);pDC-SetPixel(round(x),round(y),RGB(255,0,0));for(k=0;ksteps;k++){x+=xIncrement;y+=yIncrement;pDC-SetPixel(round(x),round(y),RGB(255,0,0));}}//*************************************************//裁减函数以下是线裁剪算法classwcPt2D{public:intx,y;};//定义两全局变量constintwinLeftBitCode=1;//(1相当二进制001)常量定义constintwinRightBitCode=2;//(2相当二进制0010)constintwinBottomBitCode=4;//(4相当二进制0100)constintwinTopBitCode=8;//(8相当二进制1000)//inlineintround(constfloata){returnint(a+0.5);}inlineintinside(intcode){returnint(!code);}//两区域码为假,在裁剪窗内部inlineintreject(intcode1,intcode2)//与运算为真,线在裁剪窗外部{returnint(code1&code2);}//与运算inlineintaccept(intcode1,intcode2)//或运算为假,在裁剪窗内部{returnint(!(code1|code2));}//或运算intencode(wcPt2Dpt,wcPt2DwinMin,wcPt2DwinMax)//确定端点区域码{intcode=0;if(pt.xwinMin.x)code=code|winLeftBitCode;if(pt.xwinMax.x)code=code|winRightBitCode;//或运算,能使某位有一,就使四位相应位变一。if(pt.ywinMin.y)code=code|winBottomBitCode;if(pt.ywinMax.y)code=code|winTopBitCode;return(code);}voidswapPts(wcPt2D*p1,wcPt2D*p2){wcPt2Dtmp;tmp=*p1;*p1=*p2;*p2=tmp;}voidswapCodes(int*c1,int*c2){inttmp;tmp=*c1;*c1=*c2;*c2=tmp;}消息响应函数代码:voidCClipView::OnCohen(){CDC*pDC=GetDC();intcode1,code2;intdone=false,plotLine=false;floatm;wcPt2Dp1,p2,winMin,winMax;p1.x=80,p1.y=100;p2.x=300,p2.y=450;//用于裁剪的线段端点坐标winMin.x=80,winMin.y=100;//裁剪窗口坐标winMax.x=280,winMax.y=320;DDAline(winMin.x,winMin.y,winMax.x,winMin.y,pDC);//画裁剪窗口DDAline(winMax.x,winMin.y,winMax.x,winMax.y,pDC);DDAline(winMax.x,winMax.y,winMin.x,winMax.y,pDC);DDAline(winMin.x,winMax.y,winMin.x,winMin.y,pDC);//DDAline(round(p1.x),round(p1.y),round(p2.x),round(p2.y),pDC);while(!done){code1=encode(p1,winMin,winMax);//确定p1区域码code2=encode(p2,winMin,winMax);//确定p2区域码if(accept(code1,code2)){//判断是否完全在窗口内,是返回两参量done=true;plotLine=true;}elseif(reject(code1,code2))//判断是否完全在窗口外done=true;else{//不能判断完全在内或外的情况if(inside(code1)){//如果p1在裁剪窗口内,交换swapPts(&p1,&p2);swapCodes(&code1,&code2);}if(p2.x!=p1.x)m=(p2.y-p1.y)/(p2.x-p1.x);//算出线的斜率if(code1&winLeftBitCode){//如果与左边界与运算为真,求交点p1.y+=(winMin.x-p1.x)*m;p1.x=winMax.x;}elseif(code1&winRightBitCode){//与右边界与运算为真,求交点p1.y+=(winMax.x-p1.x)*m;p1.x=winMax.x;}elseif(code1&winBottomBitCode){//与下边界与运算为真,求交点if(p2.x!=p1.x)p1.x+=(winMin.y-p1.y)/m;p1.y=winMin.y;}elseif(code1&winTopBitCode){//与上边界与运算为真,求交点if(p2.x!=p1.x)p1.x+=(winMax.y-p1.y)/m;p1.y=winMax.y;}}}if(plotLine)//最后画出裁剪后窗口内的线段DDAline(p1.x,p1.y,p2.x,p2.y,pDC);}运行结果:实验心得:2010年12月20日教师评语:年月日

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功