《计算机图形学 实验四 二维图形的裁剪》由会员分享,可在线阅读,更多相关《计算机图形学 实验四 二维图形的裁剪(7页珍藏版)》请在人人文库网上搜索。
1、西北农林科技大学实习报告学 院名称:理 学 院 专业班级: 姓名: 学 号:课程:计算机图形学实验 报告日期:第十五周 实验四 二维图形的裁剪一、实验目的1)加深直线段的剪裁算法的理解。2)熟练掌握一种裁剪算法的编程方法。二、实验步骤1)分析直线段和矩形窗口的位置关系,选定比较合理算法流程。2)画出程序流程图。3)编写程序的源程序。4)编辑源程序并进行调试。5)进行特殊模式的运行测试,并结合情况进行调整。三、实验内容1)在编码算法、中点分割算法、Liang-Barsky算法三种中任选一种作为编程模型。2)编写直线段裁剪的源程序。 3)建议有能力的学生编写多边形裁剪程序。4)在计算机上编辑编译运。
2、行,实现直线段的裁剪。原理1直线和窗口的关系:直线和窗口的关系可以分为如下3类:(1)整条直线在窗口内。此时,不需剪裁,显示整条直线。(2)整条直线在窗口外,此时,不需剪裁,不显示整条直线。(3)部分直线在窗口内,部分直线在窗口外。此时,需要求出直线与窗框的交点,并将窗口外的直线部分剪裁掉,显示窗口内的直线部分。直线剪裁算法有两个主要步骤。首先将不需剪裁的直线挑出,即删去在窗外的直线。然后,对其余直线,逐条与窗框求交点,并将窗口外的部分删去。2Cohen-Sutherland直线剪裁算法:(1)输入直线段的两端点坐标p1(x1,y1),p2(x2,y2),以及窗口的4条边界坐标,ywt,ywb。
3、,ywl,ywr.(2)对p1,p2进行编码,点p1的编码为code1,点p2的编码为code2.(3)若code1| code2=0,对直线p1p2“简取”之,转(6);否则,若code1& code20,对直线段“简弃”之,转(7);当上述两条均不满足时,进行步骤(4)。(4)确保p1在窗口外部。若p1在窗口内,则交换p1和p2的坐标值和编码。(5)根据p1编码从低位开始寻找值为1的地方 ,从而确定p1在窗口外的哪一侧,然后求出直线段与相应窗口边界的交点S,并用交点S的坐标值替换p1的坐标值,即在交点S处把线段一分为二,因此可以去掉p1S。转(2)。(6)用直线扫描算法转换算法画出当前的直。
4、线段p1p2。(7)算法结束。图形描述:在MATLAB中输入: W=3,7,2,5W =3 7 2 5 P=0,0,16,16P =0 0 16 16 r=CSCutLine(W,P)r =1程序的源程序:M文件,命名为CSCutLine% 计算机图形学 直线裁剪 CS编码算法function r=CSCutLine(W,P) %result%W=窗口坐标 P=直线两端点坐标 y=x/2W=xwl,xwr,ywb,ywt W=3,7,2,6;P=x1,y1,x2,y2 P=0,0,16,8;% clear;clc;W=3,7,2,6;P=0,0,16,8;r=CSCutLine(W,P)xwl。
5、=W(1); xwr=W(2); ywb=W(3); ywt=W(4);x1=P(1); y1=P(2); x2=P(3); y2=P(4);Rectangle=xwl,xwr,ywb,ywt;k=0;Lines=;%取出线段P1=x1,y1;P2=x2,y2;PP=P1-P2;%计算斜率if PP(1)=0k=inf;elsek=PP(2)/PP(1);endfinished=false;while (finished)%对点P1和P2进行编码code=P1(1)Rectangle(2),P1(2)Rectangle(4); P2(1)Rectangle(2),P2(2)Rectangle(。
6、4);% P1,P2,k,code%进行简取或简弃的判断test=code(1,:)|code(2,:);%判断是否简取if isempty(find(test0,1)Lines=Lines;P1,P2;finished=true;end%若当前线段处理完成,则退出if finishedbreak;end%判断是否简弃test=code(1,:)&code(2,:);if isempty(find(test0,1)finished=true;endif finishedbreak;end%确保P1在窗口之外if isempty(find(code(1,:)0,1)%交换P1,P2的坐标值和编码。
7、PT=P1; P1=P2; P2=PT;PT=code(1,:); code(1,:)=code(2,:); code(2,:)=PT;end%从低位开始找编码值为1的地方D=find(code(1,:)0,1);if D0,1);else%若线段是斜线,则计算y值,x值变为窗口的左边界或右边界P1=Rectangle(D),P1(2)+k*(Rectangle(D)-P1(1);endelse%此时P1位于窗口的上方或下方if k=inf%若线段是竖直线,则x不变,y变为窗口的上边界或下边界%且此时k不会等于0,否则线段将处于简弃状态。P1(2)=Rectangle(D);else%若线段是。
8、斜线,则计算x值,y值变为窗口的上边界或下边界。P1=P1(1)+(Rectangle(D)-P1(2)/k,Rectangle(D);endend%对P1和P2重新编码,再次计算。%P1,P2,k,code%pause(1);%scanf(D,%d);%inputdlg();end%对最终点进行取整运算%Lines=floor(Lines);%-%绘制原始图像和裁剪后图形figureOriginalLines=x1,y1,x2,y2; %lines=P1,P2;plot(OriginalLines(1,1,3),OriginalLines(1,2,4),b);title(原始图像)grid 。
9、onfigurehold onR=Rectangle;RLines=R(1),R(3),R(2),R(3);R(2),R(3),R(2),R(4);R(2),R(4),R(1),R(4);R(1),R(4),R(1),R(3);for i=1:length(RLines(:,1)plot(RLines(i,1,3),RLines(i,2,4),-r);endSutherlandedLines=Lines;plot(SutherlandedLines(1,1,3),SutherlandedLines(1,2,4),g);title(裁剪后图形)grid onhold offfigurehold 。
10、onplot(OriginalLines(1,1,3),OriginalLines(1,2,4),b);plot(SutherlandedLines(1,1,3),SutherlandedLines(1,2,4),g);for i=1:length(RLines(:,1)plot(RLines(i,1,3),RLines(i,2,4),-r);endlegend(原始图像,裁剪后图形,裁剪窗口,0)grid onhold offr=true;end四、实验总结通过本次实习,我复习了直线段的Cohen-Sutherland算法,中点分割算法,以及Liang-Barsky算法思想,最后选择了Cohen-Sutherland算法完成Matlab编程。本次实习的内容有一定难度, 要综合运用前面实习中的直线绘制函数,在算法中还须设计一个端点编码判定函数。另外,由于直线段与窗口的位置有多种情况,我们要分不同情况进行实现,这也增大的代码量。这次的实验有一个要注意的问题,在输入窗口点的时候,需要保证窗口中要有线段。如果没有线段,第二个图剪裁后的图形的输出就是一片空白,最后的比较图就会出现程序错误。这是这次编写的程序需要改进和完善的地方。