实验报告学院:计算机科学与信息学院 专业:计算机科学与技术 班级:计科102姓名林勇学号1007300332实验组实验时间2012. 10指导教师成绩实验项目名称冇线裁减,多边形裁剪对于直线/多边形的裁剪实验,要求实现标准矩形窗口的裁剪,窗口由键盘输入或 根标确定,育•线/多边形祁是任意的裁剪后的图形要准确,不能多或者少点木次用 Cohen-SutherLand 算法实现Cohen-SutherLand算法(编码算法)直线算法原理対于每条线段P*2分为三种情况处理:(1)若卩1卩2完全在窗口内,则显示该线段卩1卩22)若卩代2明显在窗口外,则丢弃该线段3)若线段不满足(1)或(2)的条件,则在交点处把线段分为两段其中一段完全在窗口外,可弃之然后对另一段重复上述处理为快速判断,采用如下编码方法:由窗口四条边所在直线把二维 平面分成9个区域(右图),每个区域 赋予一个四位编码:CtCbCrC](上100110001010下右左);直线的端点都按其所处区 域赋予相应的区域码,用来标识岀 端点和对于裁剪矩形边界的位置各位编码含义:上:if y>ymax,Ct= 1, else, 0;000100000010010101000110下:讦yv『max,cb=1, else,0;右:if x>xmax,Cr=l, else, 0;左:if x
如果两端点的编码相与不为0000,表示直线在窗口外如果两端点的编码不全为0000,但相与为0000,则该直线部分可见, 需计算直线与窗口的交点,确定哪一部分可见2) Sutheiiand-Hodgema算法(多边形裁减算法原理)通过对单一边或面的裁剪来实现多边形的裁剪分割处理策略:将多边形关于矩形窗口的裁剪分解为多边形关于窗口四 边所在直线的裁剪一次用窗口的一条边裁剪多边形流水线过程(左丄右下):前边的结果是后边的输入亦称逐边裁剪算法算法的每一次输出(包括中间结果)都是一个多边形的顶点表,且所有 顶点均位于相应窗口裁剪边或面的可见一侧由于多边形的每一条边需要与 裁剪边或面分别进行比较,因此只需要讨论单条边和单个裁剪边或面之间可 能的位置关系假设S, P为多边形的两个相邻顶点,且S为该边的起点,P为该 边的终点,则变SP与裁剪边或面之间只有4种可能的关系把平面分成两个部分:一部分包含窗口,成为可见i侧;另一部分称 为不可见一侧依序考虑多边形各边的两端点S,P它们与裁剪线的位置关 系只有4中情况可见一侧可见-•侧(1) S,p均在可见一侧,计为P点P(2) S,卩均不在可见一侧可见i侧(3) S可见,P不可见由上可见,每一次将多边形的边与裁剪边或面比较后,输出一•个或两个 顶点,也可能无输出点。
如果SP边完全可见,则输出P点,不必输出起点S, 因为顶点是按顺序处理的,S是作为前一•边的终点输出的如果SP边完全不 可见,则无输出如果SP边部分可见,则SP边可能进入或离开裁剪边或而 的可见一侧如果SP边离开裁剪边或面的可见一侧,则输出SP与裁剪边 或面交点如果SP边进入裁剪边或面的可见一侧,则输出两点,一个为SP 与裁剪边或面的交点,一个是P点对于多边形的第一个顶点,只需判断其可见性如果可见,则输出且作 为起点S;否则无输出,但还是要作为S保存,以便后续点处理对于最后一条边PnPr其处理方法是:标志第一顶点为F,这样最后一 条边则为I^F,可与其他边作和同的处理实现方法:■设置二个表:♦输入顶点表:用于存放被裁剪多边形的顶点Pi-Prno♦输出顶点表:用于存放裁剪过程中及结果的顶点qrqno■输入顶点表4咯顶点要求按一定顺序排列,一般可采用顺时针或逆 时针方向■相对于裁剪窗口的各条边界,按顶点表中的顺序,逐边进行裁剪实验环境Visual studio VC++ 6.0实 验 丄匕少骤2. Sutherland-Hodgema算法剪裁算法思想,编写相应的程序,下面给出主要代码:(1)算法流程图:AZ】即为可见部分(2)代码实现class SutherlandHodgnan {public:SutherlandHodgman(RectF& boundaries):m_stage^ottom(m_stageOut, boundaries.GetBottom()) ,m_stageLeFt(m_stageBottoii, boundaries.GetLeFt()) ,m_stageTop(n_stageLeft, boundaries.GetTop()),m_stageRight(n_stageTop, boundaries.GetRight())uoid Clip(pointUector& input, pointUector& clipped) clipped.clear();m_stageOut.SetDestination(& clipped);// Clip each input vertex.For (cpointlterator it = input .begin(); it ?= input .en // Do the Final step.m_stageRight.Finalize();uoid CChildUiew::OnLButtonUp(UINT nFlags, CPoint point)>else
实验结果1•对直线裁剪运行的结果如下:点击“画矩形”,在绘图去用鼠标绘制要被裁切的直线如图:点击“裁剪”,实行相应算法完成裁减,如下图:2.对多边形裁剪运行的结果如下:(1)运行的界而如下:(2)用鼠标拖动画一个多边形,如下其中红色部分表示裁剪后的结果实验总结1、 通过本次试验,我对Cohen-Sutherland直线剪裁算法和 Sutherland-Hodgman多边形裁剪算法有了更深刻的了解2、 进行图形裁剪吋,首先在课堂上了解了有关裁剪算法的过程,然后 在进行代码的实现3、 在做实验的时候也遇到了些问题,由于对算法的细节有些问题,使 得代码编写中出现了错误经过了讨论研究,使得问题得以解决,从这个过 程中学习到了很多东西这次实验让我受益匪浅。