如何在Polyfill算法中处理Horizantal?

时间:2016-02-18 05:32:32

标签: python python-2.7 computer-science

我有一个形状,它看起来很像: enter image description here
好吧,根据polyfill algorithm来填充我需要通过扫描线的区域的颜色 我提供了6条扫描线。

扫描1 :从y=-1开始,如下所示: enter image description here
你知道如果前一个顶点/点和下一个顶点/点在同一侧,它将不会被认为是交叉点。

#list of lines that each line contain [(startpoint, endpoint)]
listLines = [[(4,-1),(4,-2)]]

扫描2 :从y=-2开始,如下所示: enter image description here
同样的事情发生在这里,因为 Point13 Point15 在同一边 Point14 不被视为交集,以及 Point9 (因为 Point10 Point8 在同一侧)。

#list of lines that each line contain [(startpoint, endpoint)]
listLines = [[(1.7,-2),(6.5,-2)]]

扫描3 :从y=-3开始,如下所示: enter image description here
但这里有混乱的部分,现在我没有得到水平线。

#list of lines that each line contain [(startpoint, endpoint)]
listLines = [[(2.4,-3),(7,-3)],[(9,-3),(10.5,-3)]]

扫描4 :从y=-4开始,如下所示: enter image description here
而且在这里我只得到水平线!!

#list of lines that each line contain [(startpoint, endpoint)]
listLines = [[(2,-4),(3,-4)],[(5,-4),(8,-4)]]

扫描5 :从y=-5开始,如下所示: enter image description here

在这里一切都很完美。

#list of lines that each line contain [(startpoint, endpoint)]
listLines = [[(3.5,-5),(5,-5)],[(6,-5),(9.5,-5)]]

扫描6 :从y=-6开始,如下所示: enter image description here
在这里也很完美,我没有交集。

#list of lines that each line contain [(startpoint, endpoint)]
listLines = []

当我查看polyfill算法教程/文章或示例时,没有提到如何处理水平线。任何人都知道应该如何处理水平线?

注意:所以根据我的理解:
如果下一行和前一行在同一侧,不要像这样计算任何交叉点:
enter image description here
但如果下一行和前一行是相反的,那么:
enter image description here
到目前为止,我必须查看我收集的顶点总数。

1-如果是偶数,我将添加第一个交叉点 2-如果是Odd,我将添加最后一个交叉点。

但如果在扫描线上铺设线条,它就无法工作!!看看这个例子: enter image description here

所以为了解决这个问题,我提出了一个解决方案,我需要运行一个优化并重建形状,只需找到每个线方程,然后找到具有相同方程的那个,删除共享顶点,使形状简单,以便在任何线上都不会有任何额外的顶点。

他们对扫描线算法到目前为止感到奇怪,但没有提及有关重叠线方程的任何内容。不是吗?

1 个答案:

答案 0 :(得分:1)

让我们做一些低效但正确的事情。

对于每个扫描线,我们将从Point0开始遍历整个多边形并返回到point0。

在扫描线3

Edge (0,1) , point (2.4, -3) -> down-down   (keep the intersection)
Edge (1,2)
Edge (2,3)
Edge (3,4)
Edge (4.5)
Edge (5.6)
Edge (6,7)
Edge (7,8)
Edge (8,9) , point (10.5, -3) -> up-up (keep the intersection)
Edge (9,10), point (9, -3) -> down-left (uh-oh)
Edge (10, 11), points (9, -3) to (7, -3) -> down->left->up (no need to keep any intersection)
Edge (11, 12), point (7, -3) -> left-up (uh-oh)
Edge (12,13)
Edge (13,14)
Edge (14,15)

虽然您有在O(n)时间内对点进行排序的算法,但现在不用担心效率,只需应用我们最喜欢的快速排序并沿x轴排序点。

所以我们只能正确得到两点。

在第4行扫描

Edge (0,1), point (3, -4) -> down-left (uh-oh)
Edge (1,2), points (3,-4) to (2,-4) -> down-left-down (keep point (2,-4))
Edge (2,3), point (2,-4) -> left-down -> (uh-oh)
Edge (3,4), point (5,-4) -> up-right (uh-oh)
Edge (4,5), points (5,-4) to (8,-4) -> up-right-down (ignore)
Edge (5,6), point (8,-4) -> right-down (uh-oh)
Edge (7,8), point (11, -4) -> up-up -> however at top point, (keep point (11,-4).
Edge (8,9), point (11, -4) -> up-up -> however at bottom point, already kept it (ignore)
Edge (9,10)
Edge (10,11)
Edge (11,12)
Edge (12,13)
Edge (13,14)
Edge (14,15)

在最坏的情况下,多边形可能有很多绕组。任何算法都应该正确地工作。例如见下文: enter image description here

有几种方法可以做到这一点。本地信息就足够了:根据转弯和内部所在的一侧,我们可以决定采取哪一点。

enter image description here