多边形裁剪算法

合集下载

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

一个任意多边形的裁剪算法
a 3
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多边形裁剪算法

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-Atherton多边形裁剪算法是一种用于计算两个多边形的相交部分的算法。

该算法可以确定两个多边形之间的交集,并生成裁剪后的多边形。

该算法是由Weiler于1977年提出,并由Atherton稍后改进而得名。

它是一种基于点的算法,通过遍历多边形的顶点和边缘来确定它们之间的交集。

Weiler-Atherton多边形裁剪算法非常适用于计算计算机图形学中的裁剪操作,例如裁剪线段、多边形或曲线。

它可以用于裁剪2D和3D场景中的对象,以提高性能并减少渲染的计算量。

下面将为您详细介绍Weiler-Atherton多边形裁剪算法的具体步骤。

步骤1:确定裁剪区域首先,需要定义一个裁剪区域,它是一个多边形,用于裁剪目标多边形。

裁剪区域可以是任何形状,包括凸多边形和凹多边形。

步骤2:确定多边形边缘与裁剪区域的交点接下来,需要遍历目标多边形的所有边缘,并找出它们与裁剪区域的交点。

对于每个边缘,需要检查它是否与裁剪区域相交,并找出相交点的坐标。

步骤3:确定裁剪区域边缘与多边形的交点然后,需要遍历裁剪区域的所有边缘,并找出它们与目标多边形的交点。

同样地,对于每个边缘,需要检查它是否与目标多边形相交,并找出相交点的坐标。

步骤4:确定裁剪多边形的内、外部点在这一步中,需要根据目标多边形和裁剪区域的交点,确定哪些点位于裁剪多边形的内部,哪些点位于外部。

一种常用的方法是使用奇偶规则,根据交点的数量判断点位于多边形内部还是外部。

步骤5:生成裁剪多边形最后,根据确定的内、外部点,生成裁剪后的多边形。

可以通过连接内部点和交点来生成裁剪后的多边形。

需要注意的是,由于Weiler-Atherton多边形裁剪算法是基于点的,因此在处理封闭多边形时需要考虑交点的顺序。

如果交点的顺序不正确,可能会导致生成的裁剪多边形出现错误。

总结Weiler-Atherton多边形裁剪算法是一种用于计算两个多边形相交部分的算法。

具有拓扑关系的任意多边形裁剪算法

具有拓扑关系的任意多边形裁剪算法

具有拓扑关系的任意多边形裁剪算法中国的地理空间数据处理发展迅速,形状分析技术受到技术界的广泛应用。

多边形裁剪是一种常见的形状分析技术,它可以用来从空间数据集中提取出多边形范围内的空间对象,以便进行深入分析和分类处理,同时也可以用来测量多边形的面积和周长等。

具有拓扑关系的多边形裁剪算法是多边形裁剪的一种,它可以从拓扑关系的多边形中提取出正确的多边形边界,而不用考虑多边形的内部点和边的连接关系。

这种算法的特点是,可以对多边形的边缘点和其他类型的点进行分类,考虑到其它多边形的拓扑关系,分析出能够完整描述多边形的边界,从而为后续空间数据处理提供了一种有效的算法。

具有拓扑关系的多边形裁剪算法的基本原理是:首先通过计算多边形内部点和边缘点之间的拓扑关系,对所有多边形内点进行分类;然后针对每个分类,采用多边形切割算法,将一个多边形分割成多个小的多边形,每个小的多边形的定义由多边形的点和边组成;最后,根据分类后的多边形点和边之间的拓扑关系,对经过分割的多个多边形边界重新进行切割,完成裁剪。

该算法与其他常见的多边形裁剪算法相比,有着明显的优势。

第一,由于该算法采用多边形分割算法和拓扑关系分析算法相结合,它能够有效地处理多边形内部点和边缘点之间的拓扑关系,从而达到较高的准确性和可靠性;第二,该算法的实现不需要大量的预处理,复杂度较低,从而大大减少了算法执行时间;第三,该算法能够有效处理多边形中出现的不闭合、重叠等异常状况,从而得到更加准确的结果。

实际应用中,该算法可以用来自动提取多边形边界,从而检测出满足特定要求的多边形,从而为后续多边形分析和处理提供可靠的基础数据。

此外,该算法也可以用来检测多边形的内部是否存在大量的噪声,以便及时采取措施将其消除,保证多边形的精确性和准确性。

总之,具有拓扑关系的多边形裁剪算法是一种有效而可靠的多边形裁剪算法,可以有效地从复杂的多边形中提取出正确的多边形边界,为地理空间数据处理提供有效的技术支持。

多边形裁剪算法

多边形裁剪算法

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次。 • 主要过程只用到加法和除法运算,适合 硬件实现,它可以用左右移位来代替乘 除法,这样就大大加快了速度。

(完整版)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]);}}//.....(注:可编辑下载,若有不当之处,请指正,谢谢!)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设置初始标志flag:
if(S在边界内侧)flag=0;
else flag=1;
设新的顶点序列数j=0;
3.对多边形各顶点进行裁剪规则处理,结果放入新的多边形顶点序列Q[][2]中:
for(对第一个顶点直到最后一个顶点,逐一处理)
{
if(Pi在边界内侧)
{
if(flag!=0)
{
flag=0;
求交点并放入新的多边形顶点序列Qj中;
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) /*判断的多边形边两个端点都在外部,不做处理*/
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 ;
//////////////////////////////////////////////////////////////////////////////////////
//-----多边形裁剪的Sutherland—Hodgman算法---------//
/////////////////////////////////////////////////////////////////////////////////////
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;
多边形裁剪的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;
{
continue;/*如果是这种情况,那么就对继续对下一条多边形边作判断,也就是说下面的判断不用做了*/
}
if(polypoint[i].x>=xl && polypoint[i+1].x>=xl) /*边两个端点都在内部,保留*/
/*因为每个保留的点在数组中只出现一次,且下一次判断时第二个端点一定会要取到,因此只保留的两个点中的第一个*/
B[m_nB].y =polypoint[i].y ;
m_nB=m_nB+1;
/*保留交点*/
x=xl;
tem1=(xl-polypoint[i].x);
void CMyClip_AView::ClipedgeL(CPoint polypoint[], CPoint clipwindow[], UINT polynum)
/*其中参数polypoint[]为多边形顶点,clipwindow[]为裁剪窗口顶点,polynum为多边形顶点数目*/
{
//找出裁剪窗口边界
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;
{
/*保留交点*/
x=xl;
tem1=(xl-polypoint[i].x);
//tem2=(xl-x1)*dy/dx+y1;
//y/x=dy/dx---->y=x*dy/dx
tem2=tem1*(polypoint[i+1].y-polypoint[i].y)/(polypoint[i+1].x-polypoint[i].x)+polypoint[i].y;
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];
{
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)/*边两个端点起点在外部,终点在内部,求交点,然后交点,终点都应该送入临时数组*/
相关文档
最新文档