《(3.5.1.2)--图形学课件高级计算机图形学原理与实践.ppt》由会员分享,可在线阅读,更多相关《(3.5.1.2)--图形学课件高级计算机图形学原理与实践.ppt(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、裁剪算法 多边形裁剪算法多边形裁剪算法多边形裁剪算法 Sutherland-Hodgman裁剪算法又称为逐边裁剪算法,基本思想是用裁剪窗口的4条边依次对多边形进行裁剪。窗口边界的裁剪顺序无关紧要,这里采用左、右、下、上的顺序。多边形裁剪算法的输出结果为裁剪后的多边形顶点序列。错误结果正确结果算法原理算法原理 输入:P0P1P2P3输出:S0S1P1P2P3(a)用窗口左边界裁剪输入:S0S1P1P2P3输出:S0S1P1S2S3P3(b)用窗口右边界裁剪输入:S5S0S1P1S2S3S4输出:S5S0S1S6S7S2S3S4(b)用窗口右边界裁剪输入:S0S1P1S2S3P3输出:S5S0S1
2、P1S2S3S4(c)用窗口下边界裁剪示例凹多边形使用Sutherland-Hodgman裁剪算法裁剪后,输出结果为两个不连通的三角形,窗口的边界AB成为了多余线段。为了正确地裁剪凹多边形,一种方法是先将凹多边形分割为两个或更多的凸多边形,然后分别使用Sutherland-Hodgman裁剪算法裁剪。另一种方法是使用Weiler-Atherton 裁剪算法。该算法适用于任何凸的、凹的带内孔的多边形裁剪,但计算工作量很大。凹多边形裁剪错误的输出结果 void CTestView:ClipPolygon(CP2*out,int Length,UINT Boundary)CP2*pTemp=new
3、CP2Length;for(int i=0;iLength;i+)pTempi=outi;CP2 p0,p1,p;/p0-起点,p1-终点,p-交点OutCount=0;p0=pTempLength-1;for(i=0;iLength;i+)p1=pTempi;if(Inside(p0,Boundary)/起点在窗口内if(Inside(p1,Boundary)/终点在窗口内,属于内内OutOutCount=p1;/终点在窗口内OutCount+;else/属于内外p=Intersect(p0,p1,Boundary);/求交点OutOutCount=p;OutCount+;else if(I
4、nside(p1,Boundary)/终点在窗口内,属于外内p=Intersect(p0,p1,Boundary);/求交点OutOutCount=p;OutCount+;OutOutCount=p1;OutCount+;p0=p1;delete pTemp;多边形裁剪算法习题习题1 用编码裁剪算法裁剪线段P0(0,2),P1(3,3),裁剪窗口为wxl=1,wxr=6,wyb=1,wyt=5,如右图所示。要求写出:(1)窗口边界划分的9个区间的编码原则。(2)线段端点的编码。(3)裁剪的主要步骤。(4)裁剪后窗口内直线段的端点坐标。P0P1直线段裁剪习题习题2 已知裁剪窗口为wxl=0,wxr=2,wyb=0,wyt=2,直线段的起点坐标为P1(3,3)终点坐标为P2(-2,-1),如右图所示。请用Liang Barsky直线段裁剪算法分步说明裁剪过程,并求出直线在窗口内部分的端点C和D的坐标值。P2P0CD 直线段裁剪直线段裁剪