多边形裁剪算法
一个任意多边形的裁剪算法

A
2
B
C
1 b
4 c
D
2 内裁剪的裁剪结果:
2、外裁剪:从被裁剪多边形的一个“出”点 开始,碰到“出”点,沿着被裁剪多边形按顺时针 方向搜集顶点序列;而当遇到“入”点时,则沿着 裁剪窗口按逆时针方向搜集顶点序列。
a
A
2 1 b
3
B
C
4 c
D
外裁剪的裁剪结果:
3、并集,从被裁剪多边形的一个顶点开始, 碰到“入”点,沿着裁剪窗口按顺时针方向搜集 顶点序列;而当遇到“出”点时,则沿着被裁剪 多边形按顺时针时针方向搜集顶点序列。
三、算法流程图
以内裁剪为例
将交点分别和被裁剪多边形及 裁剪窗口顶点放入数组3、4中 数组3中有入点 将入点录入到数组Q中 沿数组3取顶点 顶点是出点 沿数组4取顶点 顶点是入点 顶点录入 到Q中 结束
顶点=起始点
输出数组Q
四、 算法的实现及原理
1、界面
由MFC建立一个空文档,然后对界面进行手动操作, 代码由微软MFC提供自动生成,添加一些windows消息 响应函数,生成的主界面如下图:
a A 2 3 B
CHale Waihona Puke 1 b4 cD
并集裁剪结果:
五、难点:
算法在实现中,需要用到六个数组, 分别用来存放:被裁剪多边形,裁剪窗口, 交点数组,插入交点后的被裁剪多边形, 插入交点后的裁剪窗口,输出多边形。 算法的主要难点在入、出点的查寻以 及跨数组搜索上。
总结
通过大学四年的学习,我们学了很多技术方 面的理论知识,但动手能力不强,在多边形裁 剪中,有效地结合了之前所学的科目,如VC++ 编程语言,图形学,数据结构,MFC等。 通过本论文的锻炼,让我第一次在VC的环 境下使用C++实现规模较大,功能较复杂的代码 设计,使我对C++近一步的体会和理解。论文整 体基本功能已经做出,但有些功能模块由于时 间关系没能实现,没有达到预先设想的需求。 还需要我在今后的学习中,不断地研究和完善。
weiler-atherton多边形裁剪算法

weiler-atherton多边形裁剪算法weileratherton多边形裁剪算法,又称为weiler-atherton算法,是一种用于对多边形进行裁剪的算法。
它可以被用于计算机图形学中的裁剪任务,如可视化、图像处理和计算机辅助设计等领域。
本文将详细介绍weileratherton多边形裁剪算法的原理、步骤和实现方法。
1. 算法原理:weileratherton多边形裁剪算法是基于边界点的引入和处理的。
该算法将两个多边形相互之间进行裁剪,并生成裁剪结果。
算法使用四个边界点集合,分别为输入多边形的边界点集合(输入多边形顶点经过一系列处理得到),裁剪多边形的外部边界点集合和内部边界点集合,以及裁剪结果的边界点集合。
2. 算法步骤:weileratherton多边形裁剪算法的具体步骤如下:(1) 初始化:创建输入多边形的边界点集合、裁剪多边形的外部边界点集合和内部边界点集合,并将输入多边形的边界点添加至外部边界点集合中。
(2) 遍历输入多边形的每条边:对于输入多边形的每条边,判断其与裁剪多边形的相交情况。
(3) 相交情况处理:若相交情况为内部相交或外部相交,则根据交点生成新的内部边界点,并添加至相应的边界点集合中。
(4) 构造裁剪结果:根据输入多边形的边界点集合和裁剪多边形的内部边界点集合,生成裁剪结果的边界点集合。
(5) 根据边界点集合构造裁剪结果:根据裁剪结果的边界点集合,绘制裁剪结果多边形。
3. 算法实现:weileratherton多边形裁剪算法的实现可以使用编程语言来完成。
一种常用的实现方法是通过遍历输入多边形的每个边,利用线段与裁剪多边形的边界的相交情况判断是否产生交点,并根据交点生成新的边界点。
具体的实现步骤如下:(1) 初始化输入和裁剪多边形的边界点集合。
(2) 遍历输入多边形的每条边,对于每条边,判断其与裁剪多边形的每条边的相交情况。
(3) 根据相交情况,判断是否生成交点,如果有生成交点,则根据交点生成新的边界点,并添加至相应的边界点集合中。
具有拓扑关系的任意多边形裁剪算法

具有拓扑关系的任意多边形裁剪算法拓扑关系是指在空间中,几何对象之间的相对位置和连接关系。
任意多边形裁剪算法是指对于两个多边形A和B,确定A相对于B的位置关系,并将A裁剪成相对于B的部分。
常用的具有拓扑关系的任意多边形裁剪算法有Sutherland-Hodgman算法和Weiler-Atherton算法。
Sutherland-Hodgman算法是一种简单而直观的裁剪算法,它以多边形A为基础,对多边形A的每条边进行裁剪,最终得到所需的裁剪结果。
算法步骤如下:1.对于裁剪窗口的每条边界,确定其相对于多边形A的左侧。
2.对多边形A的每条边进行裁剪处理,生成新的顶点序列。
3.重复步骤2,直到对所有的边界完成处理。
4.返回裁剪结果。
其中,对于多边形A的每条边进行裁剪处理的具体步骤如下:1.对于多边形A的每条边,判断边的起点和终点是否在裁剪窗口内。
2.如果起点和终点都在窗口内,则将边加入新的顶点序列。
3.如果起点在窗口内,而终点在窗口外,则计算边与窗口边界的交点,并将交点加入新的顶点序列。
4.如果起点在窗口外,而终点在窗口内,则计算边与窗口边界的交点,并将交点作为起点加入新的顶点序列。
5.如果起点和终点都在窗口外,则忽略这条边。
Sutherland-Hodgman算法的优点在于简单易懂,对于凸多边形和凹多边形都适用,但由于其每条边都需要进行裁剪处理,效率较低。
Weiler-Atherton算法是一种基于点集的裁剪算法,它将两个多边形视为点的集合,并通过点集之间的拓扑关系进行裁剪操作。
算法步骤如下:1.对于多边形A和多边形B,找到它们的交点。
2.根据交点和各自的顺时针或逆时针顺序,将交点按序列分别加入多边形A和多边形B的顶点序列。
3.对多边形A和多边形B的顶点序列进行裁剪处理,得到裁剪结果。
Weiler-Atherton算法的优点在于避免了对每条边进行裁剪的操作,对于复杂多边形的裁剪效果好,但实现较为复杂。
以上是具有拓扑关系的任意多边形裁剪算法的简要介绍。
weiler-atherton多边形裁剪算法 -回复

weiler-atherton多边形裁剪算法-回复什么是Weiler-Atherton多边形裁剪算法?Weiler-Atherton多边形裁剪算法是一种用于计算两个多边形的相交部分的算法。
该算法可以确定两个多边形之间的交集,并生成裁剪后的多边形。
该算法是由Weiler于1977年提出,并由Atherton稍后改进而得名。
它是一种基于点的算法,通过遍历多边形的顶点和边缘来确定它们之间的交集。
Weiler-Atherton多边形裁剪算法非常适用于计算计算机图形学中的裁剪操作,例如裁剪线段、多边形或曲线。
它可以用于裁剪2D和3D场景中的对象,以提高性能并减少渲染的计算量。
下面将为您详细介绍Weiler-Atherton多边形裁剪算法的具体步骤。
步骤1:确定裁剪区域首先,需要定义一个裁剪区域,它是一个多边形,用于裁剪目标多边形。
裁剪区域可以是任何形状,包括凸多边形和凹多边形。
步骤2:确定多边形边缘与裁剪区域的交点接下来,需要遍历目标多边形的所有边缘,并找出它们与裁剪区域的交点。
对于每个边缘,需要检查它是否与裁剪区域相交,并找出相交点的坐标。
步骤3:确定裁剪区域边缘与多边形的交点然后,需要遍历裁剪区域的所有边缘,并找出它们与目标多边形的交点。
同样地,对于每个边缘,需要检查它是否与目标多边形相交,并找出相交点的坐标。
步骤4:确定裁剪多边形的内、外部点在这一步中,需要根据目标多边形和裁剪区域的交点,确定哪些点位于裁剪多边形的内部,哪些点位于外部。
一种常用的方法是使用奇偶规则,根据交点的数量判断点位于多边形内部还是外部。
步骤5:生成裁剪多边形最后,根据确定的内、外部点,生成裁剪后的多边形。
可以通过连接内部点和交点来生成裁剪后的多边形。
需要注意的是,由于Weiler-Atherton多边形裁剪算法是基于点的,因此在处理封闭多边形时需要考虑交点的顺序。
如果交点的顺序不正确,可能会导致生成的裁剪多边形出现错误。
总结Weiler-Atherton多边形裁剪算法是一种用于计算两个多边形相交部分的算法。
具有拓扑关系的任意多边形裁剪算法

具有拓扑关系的任意多边形裁剪算法中国的地理空间数据处理发展迅速,形状分析技术受到技术界的广泛应用。
多边形裁剪是一种常见的形状分析技术,它可以用来从空间数据集中提取出多边形范围内的空间对象,以便进行深入分析和分类处理,同时也可以用来测量多边形的面积和周长等。
具有拓扑关系的多边形裁剪算法是多边形裁剪的一种,它可以从拓扑关系的多边形中提取出正确的多边形边界,而不用考虑多边形的内部点和边的连接关系。
这种算法的特点是,可以对多边形的边缘点和其他类型的点进行分类,考虑到其它多边形的拓扑关系,分析出能够完整描述多边形的边界,从而为后续空间数据处理提供了一种有效的算法。
具有拓扑关系的多边形裁剪算法的基本原理是:首先通过计算多边形内部点和边缘点之间的拓扑关系,对所有多边形内点进行分类;然后针对每个分类,采用多边形切割算法,将一个多边形分割成多个小的多边形,每个小的多边形的定义由多边形的点和边组成;最后,根据分类后的多边形点和边之间的拓扑关系,对经过分割的多个多边形边界重新进行切割,完成裁剪。
该算法与其他常见的多边形裁剪算法相比,有着明显的优势。
第一,由于该算法采用多边形分割算法和拓扑关系分析算法相结合,它能够有效地处理多边形内部点和边缘点之间的拓扑关系,从而达到较高的准确性和可靠性;第二,该算法的实现不需要大量的预处理,复杂度较低,从而大大减少了算法执行时间;第三,该算法能够有效处理多边形中出现的不闭合、重叠等异常状况,从而得到更加准确的结果。
实际应用中,该算法可以用来自动提取多边形边界,从而检测出满足特定要求的多边形,从而为后续多边形分析和处理提供可靠的基础数据。
此外,该算法也可以用来检测多边形的内部是否存在大量的噪声,以便及时采取措施将其消除,保证多边形的精确性和准确性。
总之,具有拓扑关系的多边形裁剪算法是一种有效而可靠的多边形裁剪算法,可以有效地从复杂的多边形中提取出正确的多边形边界,为地理空间数据处理提供有效的技术支持。
(完整版)Weiler-Atherton任意多边形裁剪算法

Weiler-Atherton任意多边形裁剪Sutherland-Hodgeman算法解决了裁剪窗口为凸多边形窗口的问题,但一些应用需要涉及任意多边形窗口(含凹多边形窗口)的裁剪。
Weiler-Atherton多边形裁剪算法正是满足这种要求的算法。
一、Weiler-Atherton任意多边形裁剪算法描述:在算法中,裁剪窗口、被裁剪多边形可以是任意多边形:凸的、凹的(内角大于180o)、甚至是带有内环的(子区),见下图。
裁剪窗口和被裁剪多边形处于完全对等的地位,这里我们称:1、被裁剪多边形为主多边形,记为A;2、裁剪窗口为裁剪多边形,记为B。
主多边形A和裁剪多边形B的边界将整个二维平面分成了四个区域:1、A∩B(交:属于A且属于B);2、A-B(差:属于A不属于B);3、B-A(差:属于B不属于A);4、A∪B(并:属于A或属于B,取反;即:不属于A且不属于B)。
内裁剪即通常意义上的裁剪,取图元位于窗口之内的部分,结果为A∩B。
外裁剪取图元位于窗口之外的部分,结果为A-B。
观察右图不难发现裁剪结果区域的边界由被裁剪多边形的部分边界和裁剪窗口的部分边界两部分构成,并且在交点处边界发生交替,即由被裁剪多边形的边界转至裁剪窗口的边界,或者反之。
由于多边形构成一个封闭的区域,所以,如果被裁剪多边形和裁剪窗口有交点,则交点成对出现。
这些交点分成两类:一类称“入”点,即被裁剪多边形由此点进入裁剪窗口,如图中a、c、e;一类称“出”点,即被裁剪多边形由此点离开裁剪窗口,如图中b、d、f。
二、Weiler-Atherton任意多边形裁剪算法思想:假设被裁剪多边形和裁剪窗口的顶点序列都按顺时针方向排列。
当两个多边形相交时,交点必然成对出现,其中一个是从被裁剪多边形进入裁剪窗口的交点,称为“入点”,另一个是从被裁剪多边形离开裁剪窗口的交点,称为“出点”。
算法从被裁剪多边形的一个入点开始,碰到入点,沿着被裁剪多边形按顺时针方向搜集顶点序列;而当遇到出点时,则沿着裁剪窗口按顺时针方向搜集顶点序列。
多边形裁剪算法

多边形裁剪的Sutherland—Hodgman算法1>. Sutherland—Hodgman多边形裁剪算法思想该算法的基本思想是每次用窗口的一条边界及其延长线来裁剪多边形的各边。
多边形通常由它的顶点序列来表示,经过裁剪规则针对某条边界裁剪后,结果形成新的顶点序列,又留待下条边界进行裁剪,…,直到窗口的所有边界都裁剪完毕,算法形成最后的顶点序列,才是结果多边形(它可能构成一个或多个多边形)。
当多边形一个顶点Pi相对于窗口某条边界及其延长线进行剪裁时,不外乎下列四种情况(即裁剪规则):1、顶点Pi在内侧,前一顶点Pi-1也在内侧,则将Pi纳入新的顶点序列;2、顶点Pi在内侧,前一顶点Pi-1在外侧,则先求交点Q,再将Q、Pi依次纳入新的顶点序列;3、顶点Pi在外侧,前一顶点Pi-1在内侧,则先求交点Q,再将Q纳入新的顶点序列;4、顶点Pi与前一顶点Pi-1均在外侧,则顶点序列中不增加新的顶点。
2>. Sutherland—Hodgman多边形裁剪算法步骤考虑多边形相对于一条边界及其延长线进行裁剪的算法:1.从主函数得到待裁剪多边形的顶点序列P[][2]、顶点序列数n、窗口一条边界参数xl(假如为矩形窗口的左边界);2.赋初值:将顶点序列中的最后一个顶点赋给前一顶点S;设置初始标志flag:if(S在边界内侧)flag=0;else flag=1;设新的顶点序列数j=0;3.对多边形各顶点进行裁剪规则处理,结果放入新的多边形顶点序列Q[][2]中:for(对第一个顶点直到最后一个顶点,逐一处理){if(Pi在边界内侧){if(flag!=0){flag=0;求交点并放入新的多边形顶点序列Qj中;j++;}将当前顶点放入新的多边形顶点序列Qj中:Qj=Pi;j++;}else{if(flag==0){flag=1;求交点并放入新的多边形顶点序列Qj中;j++;}}将当前顶点赋给S:S=Pi;}4.做返回准备:将新的多边形顶点序列Q又逐一放回原多边形顶点序列P中:P=Q;将新的多边形顶点数j放回原多边形顶点数n中:n=j;/////////////////////////////////////////////////////////////////////////////// /////////-----多边形裁剪的Sutherland—Hodgman算法---------///////////////////////////////////////////////////////////////////////////////// //////void CMyClip_AView::ClipedgeL(CPoint polypoint[], CPoint clipwindow[], UINT polynum)/*其中参数polypoint[]为多边形顶点,clipwindow[]为裁剪窗口顶点,polynum为多边形顶点数目*/{//找出裁剪窗口边界long xl,xr,yt,yb;UINT i;xl=clipwindow[0].x;xr=clipwindow[0].x;yt=clipwindow[0].y;yb=clipwindow[0].y;for(i=1;i<=4;i++){if(xl>clipwindow[i].x)xl=clipwindow[i].x;if(xr<clipwindow[i].x)xr=clipwindow[i].x;if(yb>clipwindow[i].y)yb=clipwindow[i].y;if(yt<clipwindow[i].y)yt=clipwindow[i].y;}//CPoint B[Polygon_Num],C[Polygon_Num];UINT m_nA,m_nB;int x,y;long tem1,tem2;m_nA=polynum;/*记载原始多边形顶点顶点个数*/m_nB=0;/*记载新生成多边形顶点顶点个数*/for(i=0;i<m_nA;i++){if(polypoint[i].x<xl && polypoint[i+1].x<xl) /*判断的多边形边两个端点都在外部,不做处理*/{continue;/*如果是这种情况,那么就对继续对下一条多边形边作判断,也就是说下面的判断不用做了*/}if(polypoint[i].x>=xl && polypoint[i+1].x>=xl) /*边两个端点都在内部,保留*//*因为每个保留的点在数组中只出现一次,且下一次判断时第二个端点一定会要取到,因此只保留的两个点中的第一个*/{B[m_nB].x =polypoint[i].x ;B[m_nB].y =polypoint[i].y ;m_nB=m_nB+1;continue;}if(polypoint[i].x<xl && polypoint[i+1].x>=xl)/*边两个端点起点在外部,终点在内部,求交点,然后交点,终点都应该送入临时数组*/{/*保留交点*/x=xl;tem1=(xl-polypoint[i].x);//tem2=(xl-x1)*dy/dx+y1;//y/x=dy/dx---->y=x*dy/dxtem2=tem1*(polypoint[i+1].y-polypoint[i].y)/(polypoint[i+1].x-polypoint[i].x)+p olypoint[i].y;y=tem2;B[m_nB].x =x;B[m_nB].y =y;m_nB=m_nB+1;continue;}if(polypoint[i].x>=xl && polypoint[i+1].x<xl)/*起点在内部,终点在外,求交点,然后起点,交点送入临时数组*/{ /*保留内部点*/B[m_nB].x =polypoint[i].x ;B[m_nB].y =polypoint[i].y ;m_nB=m_nB+1;/*保留交点*/x=xl;tem1=(xl-polypoint[i].x);tem2=tem1*(polypoint[i+1].y-polypoint[i].y)/(polypoint[i+1].x-polypoint[i].x)+p olypoint[i].y;y=tem2;B[m_nB].x =x;B[m_nB].y =y;m_nB=m_nB+1;continue;}}//把第一个点的数据拷贝到最后//形成裁剪后的多边形if(i==m_nA){B[m_nB]=B[0];}//下------------------m_nA=0;for(i=0;i<m_nB;i++){if(B[i].y<yb && B[i+1].y<yb)//两个点全在下方{continue;//下一条边}if(B[i].y>=yb && B[i+1].y>=yb)//p1,p2都在yb上方{C[m_nA].x =B[i].x;C[m_nA].y =B[i].y;m_nA++;continue;}if(B[i].y<yb && B[i+1].y>=yb)//p1在下,P2在上,留交点,外->内y=yb;tem1=yb-B[i].y;//tem2=x1+(yb-y1)*dx/dytem2=tem1*(B[i+1].x-B[i].x)/(B[i+1].y-B[i].y) + B[i].x; x=tem2;C[m_nA].x =x;C[m_nA].y =y;m_nA++;continue;}if(B[i].y>=yb && B[i+1].y<yb)//p1在上方,P2在下方,留P1和交点,内-外{//save p1C[m_nA].x=B[i].x;C[m_nA].y=B[i].y;m_nA++;//留交点y=yb;tem1=yb-B[i].y;//tem2=x1+(yb-y1)*dx/dytem2=tem1*(B[i+1].x-B[i].x)/(B[i+1].y-B[i].y)+B[i].x; x=tem2;C[m_nA].x =x;C[m_nA].y =y;m_nA++;continue;}}//形成第二次裁剪多边形if(i==m_nB){C[m_nA]=C[0];}//右------------------m_nB=0;for(i=0;i<m_nA;i++){if(C[i].x>xr && C[i+1].x>xr)//P1,P2都在右方--go next{continue;if(C[i].x<=xr && C[i+1].x<=xr)//P1,P2都在左方,留P1{B[m_nB].x =C[i].x;B[m_nB].y =C[i].y;m_nB++;continue;}if(C[i].x>xr && C[i+1].x<=xr)//P1在右方,P2在左方,留交点{x=xr;tem1=C[i].x-xr;tem2=C[i].y-tem1*(C[i+1].y-C[i].y)/(C[i+1].x-C[i].x); y=tem2;B[m_nB].x =x;B[m_nB].y =y;m_nB++;continue;}if(C[i].x<=xr && C[i+1].x>xr)//P1在内,P2在外,留P1和交点{//save p1B[m_nB].x =C[i].x;B[m_nB].y =C[i].y;m_nB++;//save 交点x=xr;tem1=C[i].x-xr;tem2=C[i].y-tem1*(C[i+1].y-C[i].y)/(C[i+1].x-C[i].x); y=tem2;B[m_nB].x =x;B[m_nB].y =y;m_nB++;continue;}}//三次裁剪后的新多边形if(i==m_nA){B[m_nB]=B[0];}//上-------------------m_nA=0;for(i=0;i<m_nB;i++){if(B[i].y>yt && B[i+1].y>yt)//p1,p2都在上方,next{continue;}if(B[i].y<=yt && B[i+1].y<=yt)//p1,p2都在下方,留P1{C[m_nA].x =B[i].x;C[m_nA].y =B[i].y;m_nA++;continue;}if(B[i].y>yt && B[i+1].y<=yt)//P1在上方,P2在下方外->内,留交点{y=yt;tem1=B[i].y-yt;//tem2=x1+(yb-y1)*dx/dytem2=B[i].x-tem1*(B[i+1].x-B[i].x)/(B[i+1].y-B[i].y); x=tem2;C[m_nA].x =x;C[m_nA].y =y;m_nA++;continue;}if(B[i].y<=yt && B[i+1].y>yt)//P1在下方,P2在上方,内->外,留P1和交点{//save p1,,,C[m_nA].x =B[i].x;C[m_nA].y =B[i].y;m_nA++;//save 交点y=yt;tem1=B[i].y-yt;//tem2=x1+(yb-y1)*dx/dytem2=B[i].x-tem1*(B[i+1].x-B[i].x)/(B[i+1].y-B[i].y);x=tem2;C[m_nA].x =x;C[m_nA].y =y;m_nA++;continue;}}//形成裁剪后的多边形if(i==m_nB){C[m_nA]=C[0];}CClientDC dc(this);CPen tempen;tempen.CreatePen(PS_SOLID,1,RGB(255,0,0));dc.SelectObject(tempen);dc.MoveTo(C[0]);for(i=1;i<=m_nA;i++){dc.LineTo(C[i]);}}//.....(注:可编辑下载,若有不当之处,请指正,谢谢!)。
复杂多边形窗口的多边形裁剪的改进算法

复杂多边形窗口的多边形裁剪的改进算法复杂多边形窗口的多边形裁剪是计算机图形学领域中的一个重要问题。
这个问题涉及到了两个多边形的相交,求取相交部分的算法。
这个问题在游戏开发、工程制图、计算机辅助设计等领域都有广泛应用。
然而,复杂多边形窗口的多边形裁剪问题不易解决,深入研究之后,发现现行的算法在实际运用中存在一些问题,需要改进。
一、现行的多边形裁剪算法现行的多边形裁剪算法主要有两种,分别是Sutherland-Hodgman算法和Weiler-Atherton算法。
这两种算法在实现方面相对简单,适用面广,被广泛运用。
1. Sutherland-Hodgman算法Sutherland-Hodgman算法是一种逐边裁剪的算法。
该算法将待裁剪多边形沿着裁剪窗口的四个边分别进行裁剪,从而得到最终结果。
该算法基于的思想是将多边形沿着裁剪边拆分成多个三角形,然后对每个三角形进行分类,得到最终的结果。
但是该算法存在一定的问题,比如会向四个方向输出不必要的顶点信息。
2. Weiler-Atherton算法Weiler-Atherton算法是一种基于点和交点的算法。
该算法首先查找所有的交点,并寻找他们之间的连接线段。
这些交点和线段形成了一个新的多边形,然后将这个新多边形剔除窗口外的部分,得到最终结果。
这个算法的主要问题是,当多边形的顶点数量很大时,会产生大量的交点,造成计算时间上的消耗。
二、改进的多边形裁剪算法考虑到现行的两种多边形裁剪算法存在一定的问题,我们提出了一种改进的多边形裁剪算法。
该算法基于分段的概念,分别对多边形和裁剪窗口的各条边进行分段,以减少计算量。
具体而言,我们将多边形和窗口的边按照其坐标值的大小,分为若干个段。
然后,我们逐段进行裁剪。
这个方法最初提出于1984年,但在当时的计算机技术条件下,没有得到推广应用。
如今,我们可以用现代的算力来完成这个算法的运算。
改进算法的主要步骤如下:1. 将多边形和裁剪窗口的各条边按照其坐标值的大小,分为若干个段。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Cohen-Sutherland 直线裁剪算法小结
• 本算法的优点在于简单,易于实现。可以简单 的描述为将直线在窗口左边的部分删去,按左, 右,下,上的顺序依次进行,处理之后,剩余 部分就是可见的了。在这个算法中求交点是很 重要的,决定了算法的速度。另外,本算法对 于其它形状的窗口未必同样有效。
• 特点:用编码方法可快速判断线段的完全可见 和显然不可见。
• 为快速判断,采用如下编码方法:
Cohen-Sutherland裁剪
实现方法:
1001
1000 1010 A
C
0001 0101 0000 0100
ቤተ መጻሕፍቲ ባይዱ
0010
0110
D B
将窗口边线两边沿长,得到九个区域,每一个区 域都用一个四位二进制数标识,直线的端点都 按其所处区域赋予相应的区域码,用来标识出 端点相对于裁剪矩形边界的位置。
直接求交算法
直线与窗口边都 写成参数形式, 求参数值。
Cohen-Sutherland裁剪
• 基本思想:
对于每条线段P1P2分为三种情况处理: (1)若P1P2完全在窗口内,则显示该线段P1P2。 (2)若P1P2明显在窗口外,则丢弃该线段。 (3)若线段不满足(1)或(2)的条件,则在交点 处把线段分为两段。其中一段完全在窗口外,可弃 之。然后对另一段重复上述处理。
梁友栋-Barsky算法
线段的参数表示
x=x0+t△x
y=y0+t△y △x=x1-x0 0<=t<=1 △y=y1-y0
P0 A
Pm B P1
中点分割裁剪算法
中点分割裁剪算法
• 对分辩率为2N*2N的显示器,上述二分过 程至多进行N次。 • 主要过程只用到加法和除法运算,适合 硬件实现,它可以用左右移位来代替乘 除法,这样就大大加快了速度。
梁友栋-Barsky算法
设要裁剪的线段是P0P1。 P0P1和 窗口边界交于A,B,C,D四点,见图。 算法的基本思想是从A,B和P0三点中 找出最靠近的P1点,图中要找的点 是P0。从C,D和P1中找出最靠近P0的 点。图中要找的点是C点。那么P0C 就是P0P1线段上的可见部分。
1001 1000 1010 P1 0001 0000 0010 P3 P4 0101 0100 0110 P2
–
编码
线段裁剪
Cohen-Sutherland裁剪
如何判定应该与窗口的哪条边求交呢? 编码中对应位为1的边。 • 计算线段P1(x1,y1)P2(x2,y2)与窗口边界的交点 if(LEFT&code !=0) { x=XL; y=y1+(y2-y1)*(XL-x1)/(x2-x1);} else if(RIGHT&code !=0) { x=XR; y=y1+(y2-y1)*(XR-x1)/(x2-x1);} else if(BOTTOM&code !=0) { y=YB; x=x1+(x2-x1)*(YB-y1)/(y2-y1);} else if(TOP & code !=0) { y=YT; x=x1+(x2-x1)*(YT-y1)/(y2-y1);} 具体算法见p201
(xR,yT )
5.6直线段裁剪
• 直线段裁剪算法是复杂图形裁剪的基础。 复杂的曲线可以通过折线段来近似,从 而裁剪问题也可以化为直线段的裁剪问 题。 • 主要的四种算法
直接求交算法 Cohen-Sutherland算法 中点算法 梁友栋-barskey算法
5.6直线段裁剪
• 裁剪线段与窗口的关系:(1)线段完全可见;(2) 显然不可见;(3)其它 • 提高裁剪效率: 快速判断情形(1)(2), 对于情形(3),设法减 少求交次数和每次求 交时所需的计算量。
一旦给定所有的线段端点的区域 码,就可以快速判断哪条直线完 全在剪取窗口内,哪条直线完全 在窗口外。所以得到一个规律:
Cohen-Sutherland裁剪
–若P1P2完全在窗口内code1=0,且code2=0,则“取” –若P1P2明显在窗口外code1&code2≠0,则“弃” –在交点处把线段分为两段。其中一段完全在窗口外, 可弃之。然后对另一段重复上述处理。
P0
A
Pm B P1
中点分割算法-求线段与窗口的交点
• 从P0出发找距离P0最近可见点采用中点分割方法 –先求出P0P1的中点Pm, –若P0Pm不是显然不可见的,并且P0P1在窗口中有可见 部分,则距P0最近的可见点一定落在P0Pm上,所以用 P0Pm代替P0P1; –否则取PmP1代替P0P1。 –再对新的P0P1求中点Pm。重复上述过程,直到PmP1长 度小于给定的控制常数为止,此时Pm收敛于交点。 • 从P1出发找距离P1最近可见点采用上面类似方法。
裁剪
• 裁剪:确定图形中哪些部分落在显示区之内, 哪些落在显示区之外,以便只显示落在显示区 内的那部分图形。这个选择过程称为裁剪。
图形裁剪算法,直接影响图形系统的效率。
点的裁剪
• 图形裁剪中最基本的问题。 • 假设窗口的左下角坐标为 (xL,yB),右上角坐标为 (xR,yT),对于给定点P(x,y), 则P点在窗口内的条件是要 满足下列不等式: xL <= x <= xR (xL,yB ) • 并且yB <= y <= yT 否则,P点就在窗口外。 • 问题:对于任何多边形窗口, 如何判别?
Cohen-Sutherland算法
• 将区域码的各位从右到左编号,则坐标区 域与各位的关系为:
上 下 右 左 X X X X 任何位赋值为1,代表端点落在相应的位 置上,否则该位为0。若端点在剪取矩形 内,区域码为0000。如果端点落在矩形的 左下角,则区域码为0101。
Cohen-Sutherland算法
中点分割裁剪算法
• 基本思想:从P0点出发找出离P0最近的可见点,和从P1 点出发找出离P1最近的可见点。这两个可见点的连线 就是原线段的可见部分。 • 与Cohen-Sutherland算法一样首先对线段端点进行编 码,并把线段与窗口的关系分为三种情况,对前两种 情况,进行一样的处理;对于第三种情况,用中点分 割的方法求出线段与窗口的交点。A、B分别为距P0 、 P1最近的可见点,Pm为P0P1中点。