(完整版)Weiler-Atherton任意多边形裁剪算法
一个任意多边形的裁剪算法

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++近一步的体会和理解。论文整 体基本功能已经做出,但有些功能模块由于时 间关系没能实现,没有达到预先设想的需求。 还需要我在今后的学习中,不断地研究和完善。
chap6(2)

(2)若x>wxr,D1=1,否则D1=0;
(3)若y<wyb,D2=1,否则D2=0; (4)若y>wy口 0000 0001
1010 0010 0110 wxr
wyb 0101 wxl
0100
12
线段的端点编码
• 区域码为:
上 下 右 左 X X X X 任何位赋值为1,代表端点落在相应的位 置上,否则该位为0。
和 yB <= y <= yT
线段与裁剪窗口的关系:
(1)线段完全可见; (2)显然不可见;
a
(3)其它
如何提高裁剪效率?
快速判断情形(1)(2), 对于情形(3),设法减 少求交次数和每次求 交时所需的计算量。
b
c
线段裁剪有多种算法,但基本思想都是:
(1)线段是否全不在窗口内,是则结束。
(2)线段是否全在窗口内,是则显示该线段,结束。
裁剪:保留窗口内的部分
覆盖:保留窗口外 的部分。
用于标注
直线段裁剪算法
点的位置是裁剪中最基本的问题
(xR,yT )
假设矩形窗口的左下角坐标 为(xL,yB),右上角坐标为 (xR,yT),则点P(x,y)在窗口 内的条件是: 满足: xL <= x <= xR 否则,P点就在窗口外。
P
(xL,yB )
若端点在矩形窗口内,区域码为0000。 如果端点落在矩形窗口的左下角,则区 域码为0101。
计算机图形学二维图形的裁剪

垂直并指向屏幕里面,即右手坐标系中Z轴的负方向。 反过来,如果P在该边界线的左边(即外侧),这时AB×AP的方向与X-
Y平面垂直并指向屏幕外面,即右手坐标系中Z轴的正方向。 设:点P(x,y)、点A(xA,yA)、点B(xB,yB), 向量AB={(xB-xA),(yB-yA)}, 向量AP={(x-xA),(y-yA)}, 那么AB×AP的方向可由下式的符号来确定:
依次下去,相对于第三条、第四条边界线进行裁剪,最后输出的多边 形顶点序列即为所求的裁剪好了的多边形。如下图所示。
7.3.1 Sutherland-Hodgeman多边形裁剪
新的多边形顶点序列产生规则: 在用窗口一条边界及其延长线裁剪一个多边形时,该边界线把平面分
成两个部分:一部分称为边界内侧;另一部分称为边界外侧。 如下图所示,依序考虑多边形的各条边。假设当前处理的多边形的边为
V=(xB-xA)·(y-yA)-(x-xA)·(yB-yA)
(3-14)
因此,当V≤0时,P在边界线内侧; 而V>0时,P在边界线外侧。
练习
Sutherland-Hodgeman多边形裁剪中,常用向量叉积法来测试当前点P是 否在边界内侧。已知窗口边界A(30,100)、B(40,180),某点P(50, 300),请 问点P在边界内侧吗?
7.3 多边形的裁剪
多边形裁剪的常用算法 1.Sutherland-Hodgeman多边形裁剪 2.Weiler-Atherton任意多边形裁剪
7.3.1 Sutherland-Hodgeman多边形裁剪
Sutherland-Hodgman算法也叫逐边裁剪法,该算法是萨瑟兰德 (I.E.Sutherland)和霍德曼(Hodgman)在1974年提出的。这种算法采用了 分割处理、逐边裁剪的方法。 一、Sutherland-Hodgeman多边形裁剪算法思想:
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算法的优点在于避免了对每条边进行裁剪的操作,对于复杂多边形的裁剪效果好,但实现较为复杂。
以上是具有拓扑关系的任意多边形裁剪算法的简要介绍。
《计算机图形学》练习题答案

《计算机图形学》练习题(答案)《计算机图形学》练习题1.直线扫描转换的Bresenham算法(1) 请写出生成其斜率介于0和1之间的直线的Bresenham算法步骤。
(2) 设一直线段的起点和终点坐标分别为(1,1)和(8,5),请用Bresenham算法生成此直线段,确定所有要绘制象素坐标。
(1)①输入线段的两个端点,并将左端点存储在(x0,y0)中②将(x0,y0)装入帧缓存,画出第一个点③计算常量∆x, ∆y, 2∆y, and 2∆y-2∆x,并得到决策参数的第一个值:p0 = 2∆y - ∆x④从k=0开始,在沿线路径的每个xk处,进行下列检测:如果pk < 0,下一个要绘制的点就是(xk +1,yk) ,并且pk+1 = pk + 2∆y否则下一个要绘制的点就是(xk +1, yk +1),并且 pk+1 = pk + 2∆y- 2∆x⑤重复步骤4,共∆x-1次(2)m=(5-1)/(8-1)=0.57∆x=7 ∆y=4P0=2∆y-∆x=12∆y=8 2∆y-2∆x=-6 k pk (xk+1,yk+1)0 1 (2,2)1 -5 (3,2)2 3 (4,3)3 -3 (5,3)4 5 (6,4)5 -1 (7,4)6 7 (8,5)2.已知一多边形如图1所示,其顶点为V1、V2、V3、V4、V5、V6,边为E1、E2、E3、E4、E5、E6。
用多边形的扫描填充算法对此多边形进行填充时(扫描线从下到上)要建立边分类表(sorted edge table)并不断更新活化边表(active edge list)。
(1)在表1中填写边分类表中每条扫描线上包含的边(标明边号即可);(2)在表2中写出边分类表中每条边结构中各成员变量的初始值(3) 指出位于扫描线y=6,7,8,9和10时活化边表中包含那些边,并写出这些边中的x值、ymax值、和斜率的倒数值1/m。
表1边分y1边 x y max 1/m 4 1 1 97 4 60 05 1 9 76 0 0 61 9 6 6 0 0Y 值(Scan Line Number ) 边(Edge Number ) 1 0 2 0 3 0 4 E1 5 E6,E2 6 E6 7 E3 8 E5,E3 9E4 10 01 2 3 4 5 6 7 8 9 1表 2 边的初7 1 18 7 790 1-18 2 7 9 9 1 -19 3 36 9 991-13. 二维变换(1) 记P(xf,yf)为固定点,sx、sy分别为沿x 轴和y轴方向的缩放系数,请用齐次坐标(Homogeneous Coordinate)表示写出二维固定点缩放变换的变换矩阵。
weiler-atherton多边形裁剪算法 -回复

weiler-atherton多边形裁剪算法-回复标题:深入理解Weiler-Atherton多边形裁剪算法一、引言在计算机图形学中,多边形裁剪是一个常见的操作,用于处理复杂的几何形状。
其中,Weiler-Atherton多边形裁剪算法是一种广泛应用的算法,它能够有效地处理任意两个二维多边形之间的相交、相减和相加操作。
本文将详细解析Weiler-Atherton多边形裁剪算法的步骤和原理。
二、预备知识在深入探讨Weiler-Atherton算法之前,我们需要了解一些基本的预备知识。
1. 多边形表示:多边形通常通过其顶点序列来表示,每个顶点由其在笛卡尔坐标系中的(x, y)坐标确定。
2. 十字产品:在二维空间中,两个向量的十字产品可以用来判断它们的方向关系。
如果结果为正,那么一个向量在另一个向量的逆时针方向;如果结果为负,那么一个向量在另一个向量的顺时针方向;如果结果为零,那么两个向量平行或重合。
三、Weiler-Atherton多边形裁剪算法概述Weiler-Atherton算法主要包括以下四个步骤:1. 分析阶段:确定输入多边形的边缘和顶点的关系。
2. 前处理阶段:生成新的边和顶点,以准备后续的裁剪操作。
3. 裁剪阶段:根据分析阶段的结果,进行实际的裁剪操作。
4. 后处理阶段:清理和优化输出的多边形。
四、详细步骤解析1. 分析阶段:在这个阶段,我们需要对输入的两个多边形A和B的所有边进行遍历,确定每条边与其他边的关系。
具体来说,我们需要找到以下四种情况:- 共线边:两条边平行或重合。
- 相交边:两条边在某个点相交。
- 包含边:一条边完全包含在另一条边上。
- 不相交边:两条边不相交且不共线。
对于每种情况,我们都需要记录下相应的信息,以便在后续阶段使用。
2. 前处理阶段:在这个阶段,我们需要根据分析阶段的结果生成新的边和顶点。
具体来说,我们需要执行以下操作:- 对于每一对相交的边,我们在相交点处生成一个新的顶点,并连接这个新顶点与原来的两个顶点,形成两条新的边。
计算机图形学第7章二维图形的裁剪(2_3)

7.3.1 Sutherland-Hodgeman多边形裁剪 3、对多边形的n条边进行处理,对当前点号的考虑为:0~n-1。
for(i=0;i<n;i++) { if(当前第i个顶点是在边界内侧) /*对左边界:p[i][0]>=xmin */ { if(flag!=0) /*前一个点在外侧吗?*/ { flag=0;/*从外到内的情况,将标志置0,作为下一次循环的前一点标志*/ j++; q[j][0]=求出交点的x方向分量; /*将交点q放入新多边形*/ q[j][1]=求出交点的y方向分量; } j++; q[j][0]= p[i][0]; /*将当前点p放入新多边形*/ q[j][1]= p[i][1]; } else { if(flag==0) /*前一个点在内侧吗?*/ { flag=1;/*从内到外的情况,将标志置1,作为下一次循环的前一点标志*/ j++; q[j][0]=求出交点的x方向分量; /*将交点q放入新多边形*/ q[j][1]=求出交点的y方向分量; } } s[0]=p[i][0]; /*将当前点作为下次循环的前一点*/ s[1]=p[i][1]; }
7.2.3 梁友栋-Barsky裁剪算法
XWmin X 1 Xu ' XWmax X 1 Xu ' YWmin Y1 Yu ' YWmax Y1 Yu '
XWmin X 1 Xu '
这四个不等式可以表示为:
XWmax X 1 Xu ' YWmin Y1 Yu ' YWmax Y1 Yu '
7.2.3 梁友栋-Barsky裁剪算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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任意多边形裁剪算法思想:
假设被裁剪多边形和裁剪窗口的顶点序列都按顺时针方向排列。
当两个多边形相交时,交点必然成对出现,其中一个是从被裁剪多边形进入裁剪窗口的交点,称为“入点”,另一个是从被裁剪多边形离开裁剪窗口的交点,称为“出点”。
算法从被裁剪多边形的一个入点开始,碰到入点,沿着被裁剪多边形按顺时针方向搜集顶点序列;
而当遇到出点时,则沿着裁剪窗口按顺时针方向搜集顶点序列。
按上述规则,如此交替地沿着两个多边形的边线行进,直到回到起始点。
这时,收集到的全部顶点序列就是裁剪所得的一个多边形。
由于可能存在分裂的多边形,因此算法要考虑:将搜集过的入点的入点记号删去,以免重复跟踪。
将所有的入点搜集完毕后算法结束。
三、Weiler-Atherton任意多边形裁剪算法步骤:
1、顺时针输入被裁剪多边形顶点序列Ⅰ放入数组1中。
2、顺时针输入裁剪窗口顶点序列Ⅱ放入数组2中。
3、求出被裁剪多边形和裁剪窗口相交的所有交点,并给每个交点打上“入”、“出”标记。
然后将交点按顺序插入序列Ⅰ得到新的顶点序列Ⅲ,并放入数组3中;
同样也将交点按顺序插入序列Ⅱ得到新的顶点序列Ⅳ,放入数组4中;
4、初始化输出数组Q,令数组Q为空。
接着从数组3中寻找“入”点。
如果“入”点没找到,程序结束。
5、如果找到“入”点,则将“入”点放入S中暂存。
6、将“入”点录入到输出数组Q中。
并从数组3中将该“入”点的“入”点标记删去。
7、沿数组3顺序取顶点:
如果顶点不是“出点”,则将顶点录入到输出数组Q中,流程转第7步。
否则,流程转第8步。
8、沿数组4顺序取顶点:
如果顶点不是“入点”,则将顶点录入到输出数组Q中,流程转第8步。
否则,流程转第9步。
9、如果顶点不等于起始点S,流程转第6步,继续跟踪数组3。
否则,将数组Q输出;
流程转第4步,寻找可能存在的分裂多边形。
算法在第4步:满足“入”点没找到的条件时,算法结束。
算法的生成过程见下图所示。
四、Weiler-Atherton任意多边形裁剪算法实现:
1、算法在实现中,需要用到六个数组,分别用来存放:被裁剪多边形、裁剪窗口、交点数组、插入交点后的被裁剪多边形、插入交点后的裁剪窗口、输出多边形。
2、由于交点具有“入”、“出”标记,因此凡与交点有关的数组都要采用结构数组类型:
struct point
{
double x;
double y;
int flag;
}交点数组,数组3,数组4;
标记flag有三种状态:
0:非交点;
1:“入”点;
-1:“出”点。
3、求交点时,利用被裁剪多边形的各边去对裁剪窗口的各边求交点:
for(被裁剪多边形的各边)
{
…;
for(裁剪窗口的各边)
{
求有效交点;放入交点数组;
…;
}
}
4、交点的顺序插入,意味着要对交点数组排序后再分别插入到数组1、数组2的相应位置上。
5、所谓找“入”点、“出”点,必须根据flag找寻满足条件的顶点位置。
不光数组3中要找“入”点、“出”点,而且找到后还要转到数组4的相应顶点位置处。
对数组4的处理也同上。
这种处理在本算法中大量遇到。
五、Weiler-Atherton任意多边形裁剪算法演示:(略)
六、Weiler-Atherton任意多边形裁剪算法特点:
1、裁剪窗口可以是矩形、任意凸多边形、任意凹多边形。
2、可实现被裁剪多边形相对裁剪窗口的内裁或外裁,即保留窗口内的图形或保留窗口外的图形,因此在三维消隐中可以用来处理物体表面间的相互遮挡关系。
3、裁剪思想新颖,方法简洁,裁剪一次完成,与裁剪窗口的边数无关。
七、Weiler-Atherton任意多边形裁剪算法小结:
前面介绍的是内裁算法,即保留裁剪窗口内的图形。
而外裁算法(保留裁剪窗口外的图形)同内裁算法差不多。
外裁算法与内裁算法不同的是:
1、从被裁剪多边形的一个“出点”开始,碰到出点,沿着被裁剪多边形按顺时针方向搜集顶点序列;
2、而当遇到“入点”时,则沿着裁剪窗口按逆时针方向搜集顶点序列。
按上述规则,如此交替地沿着两个多边形的边线行进,直到回到起始点为止。
这时,收集到的全部顶点序列就是裁剪所得的一个多边形。
由于可能存在分裂的多边形,因此算法要考虑:将搜集过的“出点”的出点记号删去,以免重复跟踪。
将所有的出点搜集完毕后算法结束。
Weiler-Atherton算法的的设计思想很巧妙,裁剪是一次完成,不象Sutherland-Hodgman 多边形裁剪算法,每次只对裁剪窗口的一条边界及其延长线进行裁剪,如裁剪窗口有n条边,则要调用n次S-H算法后才能最后得出裁剪结果。
但Weiler-Atherton算法的编程实现比Sutherland-Hodgman算法稍难,主要难在入、出点的查寻以及跨数组搜索上。