您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 实验五:直线段裁剪算法的实现
实验五:直线段裁剪算法的实现班级计算1213学号201221121027姓名邹建华指导教师王丰日期2014.12.15成绩一、实验目的和要求:1、了解二维图形裁剪的原理(点的裁剪、直线的裁剪、多边形的裁剪);2、实现直线段的裁剪算法;二、实验内容1、理解直线裁剪的原理(Cohen-Surtherland算法、梁友栋算法)2、实现直线的编码裁剪算法,在屏幕上用一个封闭矩形裁剪任意一条直线。3、编写上述算法程序,在工作区域当中运行并显示算法效果;4、将直线段裁剪模块添加到设计的图形实验系统当中;5、完成代码编写、调试;6、尝试实现梁友栋裁剪算法;三、实验过程及结果分析1、直线的编码裁剪算法流程图及显示结果:Cohen-Surtherland算法#includegraphics.h#includeconio.h#includemath.h#includestdio.hintw1=90,w2=270,w3=40,w4=160;//定义窗口的几个关键点坐标voidclipline(char*a,int&x,int&y,intx1,inty1,intx2,inty2)//求出与区域中各个方向边的交点{intxt1=0,yt1=0,xt2=0,yt2=0,xt3=0,yt3=0,xt4=0,yt4=0;if(*a=='1'){yt1=y1+(y2-y1)*(w1-x1)/(x2-x1);xt1=w1;}//求左交点if(*(a+1)=='1'){yt2=y1+(y2-y1)*(w2-x1)/(x2-x1);xt2=w2;}//求右交点if(*(a+2)=='1'){xt3=x1+(x2-x1)*(w3-y1)/(y2-y1);yt3=w3;}//求下交点if(*(a+3)=='1'){xt4=x1+(x2-x1)*(w4-y1)/(y2-y1);yt4=w4;}//求上交点//有可能会求出两个交点,例如左交点和上交点,必然有一个是超出窗口范围的//必须将其排除if(xt1=270&&xt1=90&&yt1=160&&yt1=40){x=xt1;y=yt1;}if(xt2=270&&xt2=90&&yt2=160&&yt2=40){x=xt2;y=yt2;}if(xt3=270&&xt3=90&&yt3=160&&yt3=40){x=xt3;y=yt3;}if(xt4=270&&xt4=90&&yt4=160&&yt4=40){x=xt4;y=yt4;}}voidcode(intxi,intyi,char*a)//四位编码的实现{if(xiw1)*a='1';//左if(xiw2)*(a+1)='1';//右if(yiw3)*(a+2)='1';//下if(yiw4)*(a+3)='1';//上return;}voidclipdraw(intx1,inty1,char*a,intx2,inty2,char*b){intx11,y11,x21,y21;ints1=0,s2=0;code(x1,y1,a);//得到直线第一个端点的编码code(x2,y2,b);//得到直线第二个端点的编码if(*a=='0'&&*b=='0'&&*(a+1)=='0'&&*(b+1)=='0'&&*(a+2)=='0'&&*(b+2)=='0'&&*(a+3)=='0'&&*(b+3)=='0')line(x1,y1,x2,y2);//若两个端点的编码全为0,则直线完全可见elseif((a[0]-48)*(b[0]-48)+(a[1]-48)*(b[1]-48)+(a[2]-48)*(b[2]-48)+(a[3]-48)*(b[3]-48)==0){//两端点四位编码的逻辑乘为0if(!(a[0]=='0'&&a[1]=='0'&&a[2]=='0'&&a[3]=='0'))//第一个端点不在窗口内,求与窗口交点{clipline(a,x11,y11,x1,y1,x2,y2);s1=1;}if(!(b[0]=='0'&&b[1]=='0'&&b[2]=='0'&&b[3]=='0'))//第二个端点不在窗口内,求与窗口交点{clipline(b,x21,y21,x1,y1,x2,y2);s2=1;}if(s1==1&&s2==1)line(x11,y11,x21,y21);//说明两个端点均不在窗口内,直线与窗口有两个交点if(s1==1&&s2==0)line(x11,y11,x2,y2);//说明第一个端点不在窗口内,第二个在,直线与窗口有一个交点if(s1==0&&s2==1)line(x1,y1,x21,y21);//说明第二个端点不在窗口内,第一个在,直线与窗口有一个交点}}voidmain(){intx1=50,y1=20,x2=250,y2=200;chara[4]={'0','0','0','0'};charb[4]={'0','0','0','0'};//分别初始化两个端点的编码数组intdriver=VGA,mode=VGAHI;initgraph(&driver,&mode,);setcolor(GREEN);rectangle(w1,w3,w2,w4);//画出窗口setcolor(YELLOW);line(x1,y1,x2,y2);//画出裁剪之前的直线setcolor(WHITE);settextstyle(16,0,_T(宋体));outtextxy(150,300,计算1213班201221121027邹建华);cleardevice();//清除屏幕setcolor(GREEN);rectangle(w1,w3,w2,w4);//再次画出窗口setcolor(RED);clipdraw(x1,y1,a,x2,y2,b);//画出保留在窗口内的直线setcolor(WHITE);settextstyle(16,0,_T(宋体));outtextxy(150,300,计算1213班201221121027邹建华);getch();closegraph();//关闭图形系统}
本文标题:实验五:直线段裁剪算法的实现
链接地址:https://www.777doc.com/doc-4424126 .html