您好,欢迎访问三七文档
计算机图形学实验报告实验(四)实验题目:线段裁剪算法指导老师:吴颖斌专业:数字媒体技术班级:1306班姓名:xx(20131006xx)2014年11月19日第2页共5页一、实验类型验证性。二、实验目的和要求目的:编写线段裁剪算法程序,验证算法的正确性。要求:编写Cohen-Sutherland直线剪裁算法程序,编译、调试,查看运行结果。三、实验中用到的硬件设备及软件环境MicrosoftVisualC++6.0和PC机四、实验主要程序代码Cohen-Sutherland直线剪裁算法(1)主要步骤和代码:步骤1:创建Code_Clip工程文件;步骤2:在主程序的程序头部定义符号常量(鼠标双击“CCode_ClipView”,添加至“classCCode_ClipView:public…………”之前)#defineLEFT1#defineRIGHT2#defineBOTTOM4#defineTOP8步骤3:定义成员变量和成员函数(鼠标双击“CCode_ClipView”,添加至“classCCode_ClipView:public…………”之内))intWT;intWB;intWR;intWL;步骤4:在构造函数中为窗口边界变量赋初值CCode_ClipView::CCode_ClipView(){//TODO:addconstructioncodehereWL=100;WR=400;WB=100;WT=300;}步骤5:编写成员函数程序(在“CCode_ClipView”单击鼠标右键--Addmemberfunction……)voidCCode_ClipView::encode(intx,inty,int*code){第3页共5页intc=0;if(xWL)c=c|LEFT;elseif(xWR)c=c|RIGHT;if(yWB)c=c|BOTTOM;elseif(yWT)c=c|TOP;*code=c;}intCCode_ClipView::C_S_Line(CDC*pDC,intx1,inty1,intx2,inty2){//CDC*pDC=GetDC();intcode1,code2,code,x,y;encode(x1,y1,&code1);//(x1,y1)处的编码encode(x2,y2,&code2);//(x2,y2)处的编码while(code1!=0||code2!=0)//当code1不等于0或code2不等于0{if((code1&code2)!=0)return0;//当code1与code2不等于0,在同侧;code=code1;if(code1==0)code=code2;if((LEFT&code)!=0)//求交点{x=WL;y=y1+(y2-y1)*(WL-x1)/(x2-x1);}elseif((RIGHT&code)!=0){x=WR;y=y1+(y2-y1)*(WR-x1)/(x2-x1);}elseif((BOTTOM&code)!=0){y=WB;x=x1+(x2-x1)*(WB-y1)/(y2-y1);}elseif((TOP&code)!=0){y=WT;x=x1+(x2-x1)*(WT-y1)/(y2-y1);}if(code==code1){x1=x;y1=y;encode(x,y,&code1);第4页共5页}else{x2=x;y2=y;encode(x,y,&code2);}}//endwhile,表示code1,code2都为0,其中的线段为可视部分pDC-MoveTo(x1,y1);pDC-LineTo(x2,y2);}步骤6:编写OnDraw()程序voidCCode_ClipView::OnDraw(CDC*pDC){CCode_ClipDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahere//定义三条直线的坐标intx11,y11,x21,y21,x12,y12,x22,y22,x13,y13,x23,y23;x11=50;y11=150;x21=450;y21=250;x12=150;y12=150;x22=350;y22=240;x13=50;y13=400;x23=500;y23=350;//定义画笔CPenPenRed(PS_SOLID,1,RGB(255,0,0));//定义红色笔CPenPenBlue(PS_SOLID,1,RGB(0,0,255));//定义蓝色笔//先画出窗口,用蓝色pDC-SelectObject(&PenBlue);pDC-Rectangle(WL,WB,WR,WT);//先画出三条直线,用红线pDC-TextOut(x11,y11,line1:);pDC-MoveTo(x11,y11);pDC-LineTo(x21,y21);pDC-TextOut(x12,y12,line2:);pDC-MoveTo(x12,y12);pDC-LineTo(x22,y22);pDC-TextOut(x13,y13,line3:);pDC-MoveTo(x13,y13);pDC-LineTo(x23,y23);//用蓝线,画出裁剪三条线pDC-SelectObject(&PenBlue);C_S_Line(pDC,x11,y11,x21,y21);C_S_Line(pDC,x12,y12,x22,y22);C_S_Line(pDC,x13,y13,x23,y23);}步骤7:编译、调试,查看运行结果。第5页共5页(2)运行结果如图1所示。五、程序运行结果或数据记录图1Cohen-Sutherland直线剪裁算法六、实验总结与体会通过本次实验,让我了解到了Cohen-Sutherland直线剪裁算法剪裁直线实现的具体过程,并且对剪裁直线的过程和特点也有个更进一步的学习和掌握。由于用的是MFC实现的,所以通过此次实验,对MFC的使用也得到了强化。
本文标题:线段裁剪算法
链接地址:https://www.777doc.com/doc-2057463 .html