我有一个形状,它看起来很像:
好吧,根据polyfill algorithm来填充我需要通过扫描线的区域的颜色
我提供了6条扫描线。
扫描1 :从y=-1
开始,如下所示:
你知道如果前一个顶点/点和下一个顶点/点在同一侧,它将不会被认为是交叉点。
#list of lines that each line contain [(startpoint, endpoint)]
listLines = [[(4,-1),(4,-2)]]
扫描2 :从y=-2
开始,如下所示:
同样的事情发生在这里,因为 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
开始,如下所示:
但这里有混乱的部分,现在我没有得到水平线。
#list of lines that each line contain [(startpoint, endpoint)]
listLines = [[(2.4,-3),(7,-3)],[(9,-3),(10.5,-3)]]
扫描4 :从y=-4
开始,如下所示:
而且在这里我只得到水平线!!
#list of lines that each line contain [(startpoint, endpoint)]
listLines = [[(2,-4),(3,-4)],[(5,-4),(8,-4)]]
在这里一切都很完美。
#list of lines that each line contain [(startpoint, endpoint)]
listLines = [[(3.5,-5),(5,-5)],[(6,-5),(9.5,-5)]]
扫描6 :从y=-6
开始,如下所示:
在这里也很完美,我没有交集。
#list of lines that each line contain [(startpoint, endpoint)]
listLines = []
当我查看polyfill算法教程/文章或示例时,没有提到如何处理水平线。任何人都知道应该如何处理水平线?
注意:所以根据我的理解:
如果下一行和前一行在同一侧,不要像这样计算任何交叉点:
但如果下一行和前一行是相反的,那么:
到目前为止,我必须查看我收集的顶点总数。
1-如果是偶数,我将添加第一个交叉点 2-如果是Odd,我将添加最后一个交叉点。
所以为了解决这个问题,我提出了一个解决方案,我需要运行一个优化并重建形状,只需找到每个线方程,然后找到具有相同方程的那个,删除共享顶点,使形状简单,以便在任何线上都不会有任何额外的顶点。
他们对扫描线算法到目前为止感到奇怪,但没有提及有关重叠线方程的任何内容。不是吗?答案 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)
在最坏的情况下,多边形可能有很多绕组。任何算法都应该正确地工作。例如见下文:
有几种方法可以做到这一点。本地信息就足够了:根据转弯和内部所在的一侧,我们可以决定采取哪一点。