📜  偶数方法和绕组数方法-多边形的内部和外部测试

📅  最后修改于: 2021-09-16 10:31:29             🧑  作者: Mango

介绍 :
一个多边形可以表示为许多连接的线段,从一个封闭的图形开始。
多边形可以用两种方式表示 –
(i) 使用移动命令的概述和
(ii) 通过将多边形内部的像素设置为高像素,包括边界上的像素,作为实体对象。

要确定一个点是否在多边形内,在计算机图形学中,我们有两种方法:
(a) Even-Odd 法(odd-parity rule)
(b) 绕组数方法-内

奇偶法:
在要检查的点 (P) 和多边形外部的已知点之间构建线段是确定点是否位于多边形内部的一种方法。然后计算线段与多边形边界相交的次数。如果与该线相交的多边形边数为奇数,则点(P)为内部点;否则,该点为外部点。

在图中,“A”的线段穿过单边,因此点 A 在多边形内。点 B 也在多边形内部,因为来自 B 的线段穿过三个(奇数)边。但是点 C 在多边形之外,因为 C 的线段穿过两条(偶数)边。

多边形

但是当交点是顶点时,这个奇偶测试失败。
为了处理这种情况,我们必须做一些修改。
我们必须查看在这个顶点相交的多边形的两个线段的另一个端点。如果这些点位于构造线 A’P’ 的同一侧,则交点计为偶数个交点。但如果它们位于构造线 AP 的另一侧,则交点算作单个交点。

多边形

正如我们所看到的,线段 A’P’ 在 M 处相交,M 是一个顶点,L & Z 是两条线段在 M 处相交的另一端点。 L & Z 位于线段 A’P’ 的同一侧,所以计数被视为偶数。

绕组数法:
还有另一种定义多边形内点的替代方法称为绕数法。从概念上讲,可以在要检查的点 (P) 和多边形边界上的点之间拉伸一段弹性。
对待这一点,将弹性连接到点 (P) 以进行牢固检查,并且弹性的另一端沿着多边形的边界滑动,直到它完成一个完整的循环。然后我们检查弹性体围绕交叉点缠绕了多少次。如果它至少被缠绕一次,则点在里面。如果没有网络绕组,则点在外面。

在这种方法中,我们不是只计算交叉点,而是给每条边界线交叉一个方向号,然后将这些方向号相加。方向编号表示相对于我们为测试构建的线段绘制的多边形边的方向。

示例:为了测试一个点 (x i , y i ),让我们考虑一条水平线段 y = y i ,它从多边形外部延伸到 (x i , y i )。我们找到所有穿过这条线段的边。
现在有两种方法可以让边交叉,可以从末端下方开始绘制边,交叉并结束在线上方。在这种情况下,我们可以给定方向编号 – 1,向侧面或边缘可以从线上方开始并在其下方结束,在这种情况下,给定方向 1。与构建的水平线交叉的侧面的方向编号总和段产生该点的“绕组数”。

如果缠绕数不为零,则该点在多边形内部,否则,在多边形外部。

多边形

在上图中,线段穿过 4 个方向编号不同的边:1、-1、1&-1,然后:
绕组数 = 1 + (-1) + 1 + (-1) = 0
所以点 P 在多边形之外。边的方向编号为 -1,因为它从线段下方开始并在上方结束。同样,边的方向编号为+1,因为它从线段上方开始并在线段下方结束(参见图中的方向)。