1、直线裁减多边形裁剪1实验报告学院:计算机科学与信息学院 专业:计算机科学与技术 班级:07软件2姓名学号实验组实验时间2010-5-10指导教师成绩实验项目名称直线裁减,多边形裁剪实验目的掌握常用的裁减及消隐算法:直线、多边形的裁减。在MFC上实现基本算法。实验要求 在其中的一种算法中中选取一种完成直线的裁减算法。实验原理Cohen-SutherLand算法(编码算法)直线算法原理对于每条线段P1P2分为三种情况处理:(1)若P1P2完全在窗口内,则显示该线段P1P2。(2)若P1P2明显在窗口外,则丢弃该线段。(3)若线段不满足(1)或(2)的条件,则在交点处把线段分为两段。其中一段完全在窗
2、口外,可弃之。然后对另一段重复上述处理。为快速判断,采用如下编码方法:由窗口四条边所在直线把二维平面分成9个区域(右图),每个区域赋予一个四位编码:CtCbCrCl(上下右左);直线的端点都按其所处区域赋予相应的区域码,用来标识出端点相对于裁剪矩形边界的位置。各位编码含义:上:if yymax,Ct=1,else, 0;下:if yxmax,Cr=1,else, 0;左:if xxmax,Cl=1,else, 0;对某线段的两个端点的区号进行位与运算,可知这两个端点是否同在视区的上、下、左、右; 如果两端点的编码均为0000,表示直线在窗口内。 如果两端点的编码相与不为0000,表示直线在窗口
3、外。 如果两端点的编码不全为0000,但相与为0000,则该直线部分可见,需计算直线与窗口的交点,确定哪一部分可见。(2)Sutherland-Hodgema算法(多边形裁减算法原理)通过对单一边或面的裁剪来实现多边形的裁剪分割处理策略:将多边形关于矩形窗口的裁剪分解为多边形关于窗口四边所在直线的裁剪。一次用窗口的一条边裁剪多边形。流水线过程(左上右下):前边的结果是后边的输入。亦称逐边裁剪算法。算法的每一次输出(包括中间结果)都是一个多边形的顶点表,且所有顶点均位于相应窗口裁剪边或面的可见一侧。由于多边形的每一条边需要与裁剪边或面分别进行比较,因此只需要讨论单条边和单个裁剪边或面之间可能的位
4、置关系。假设S,P为多边形的两个相邻顶点,且S为该边的起点,P为该边的终点,则变SP与裁剪边或面之间只有4种可能的关系 把平面分成两个部分:一部分包含窗口,成为可见一侧;另一部分称为不可见一侧。依序考虑多边形各边的两端点S,P。它们与裁剪线的位置关系只有4中情况。 可见一侧 S 可见一侧 P S P(1)S,P 均在可见一侧,计为P点 (2)S,P均不在可见一侧 P 可见一侧 可见一侧 P S S(3)S可见,P不可见 (4)S不可见,P可见由上可见,每一次将多边形的边与裁剪边或面比较后,输出一个或两个顶点,也可能无输出点。如果SP边完全可见,则输出P点,不必输出起点S,因为顶点是按顺序处理的
5、,S是作为前一边的终点输出的。如果SP边完全不可见,则无输出。如果SP边部分可见,则SP边可能进入或离开裁剪边或面的可见一侧。 如果SP边离开裁剪边或面的可见一侧,则输出SP与裁剪边或面交点。如果SP边进入裁剪边或面的可见一侧,则输出两点,一个为SP与裁剪边或面的交点,一个是P点。对于多边形的第一个顶点,只需判断其可见性。如果可见,则输出且作为起点S;否则无输出,但还是要作为S保存,以便后续点处理。对于最后一条边PnP1,其处理方法是:标志第一顶点为F,这样最后一条边则为PnF,可与其他边作相同的处理。实现方法: 设置二个表: 输入顶点表:用于存放被裁剪多边形的顶点p1-pm。 输出顶点表:用
6、于存放裁剪过程中及结果的顶点q1-qn。 输入顶点表中各顶点要求按一定顺序排列,一般可采用顺时针或逆时针方向。 相对于裁剪窗口的各条边界,按顶点表中的顺序,逐边进行裁剪实验环境Visual studio VC+ 6.0实验步骤1.根据Cohen-Sutherland直线剪裁算法思想,编写相应的程序,下面给出核心算法程序(1)如下为编码函数:(2)裁剪算法:(3)运行后的界面如下:2.Sutherland-Hodgema算法剪裁算法思想,编写相应的程序,下面给出主要代码:(1)算法描述:1. while 对于每一个窗口边或面 dobegin2. if P1在窗口边的可见一侧 then 输出P13
7、. for i=1 到 n dobegin4. if Pi在窗口边的可见一侧 then5. if Pi+1在窗口边的可见一侧 then 输出Pi+16. else 计算交点并输出交点7. else if Pi+1在窗口边的可见一侧,then计算交点并输出交点,同时输出Pi+1endend8. end of algorithm(2)代码实现实验内容本程序实现了标准举行窗口对任意直线和任意多边形的裁减算法,具体查看试验结果。实验结果1.对直线裁剪运行的结果如下:(1)点击“画直线”,在绘图区用鼠标绘制举行裁切窗口(2)点击“画矩形”,在绘图去用鼠标绘制要被裁切的直线。如图:(3)点击“裁剪”,实行相应算法完成裁减,如下图:2.对多边形裁剪运行的结果如下:(1)运行的界面如下:(2)用鼠标拖动画一个多边形,如下其中红色部分表示裁剪后的结果实验总结 1、通过本次试验,我对Cohen-Sutherland直线剪裁算法和Sutherland-Hodgman多边形裁剪算法有了更深刻的了解。 2、进行图形裁剪时,首先在课堂上了解了有关裁剪算法的过程,然后在进行代码的实现。3、在做实验的时候也遇到了些问题,由于对算法的细节有些问题,使得代码编写中出现了错误。经过了讨论研究,使得问题得以解决,从这个过程中学习到了很多东西。这次实验让我受益匪浅。指导教师意见签名: 年 月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1