2009-11-12 74 views
3

我有一个由点阵列确定的多边形。删除多边形中的孔

这个多边形正在交叉自己在多边形本身上做一些洞。

我的问题是:我怎样才能省略这个孔,只是得到多边形的外部点?

或者什么会是相同的,可能更容易:我应该使用哪种算法检查点是否在多边形内部,以检测多边形孔中的点作为内点?

由于提前,

/罗杰

+0

这些边界点是否按特定顺序考虑?或者你只是递给他们一袋并告诉'制作多边形'? – Novelocrat 2009-11-12 13:54:30

回答

4

首先,找到边缘的所有交叉点,这些交叉点添加到顶点列表,并在这些交叉点边缘分裂。然后,从一个显然是外部顶点(例如“最右边的”)的顶点开始,并追踪轮廓,将边和顶点添加到结果集中。追踪轮廓仅仅沿着边缘以最小角度到最后边缘。

+0

是否有任何样本可以消除多边形的交集? – Dinesh 2015-04-20 10:14:56

0

您可能想要找到多边形中所有点的凸包。

这样做的一种算法是复杂度为O(nlgn)的Graham-Scan。来自Cormen:

Let Q be the set of all points in your polygon 
Graham-Scan(Q) 

1 let p0 be the point in q with the minimum y-coordinate or the leftmost in case of tie 
2 let (p1, p2,...,pm) be the remaining points in Q, sorted by polar angle around p0 
     if more than one point shares the same polar angle, keep the farthest point 

3 let S be an empty stack 
4 PUSH(p0, S) 
5 PUSH(p1, S) 
6 PUSH(p2, S) 
7 for i = 3 to m 
8 while the angle formed by points NEXT_TO_TOP(S), TOP(S), and pi makes a non-left turn 
9  POP(S) 
10 PUSH(pi, S) 
11 return S 

S现在包含您的多边形的所有外部点。你必须做一些极坐标数学,但这很简单。按极坐标排序按照您最底部的点排列其余切点上的所有点。我忘记了检查右转的代码,但是如果你只是从格雷厄姆扫描中搜索,它就在互联网上。希望这可以帮助!

+0

考虑一个大致为L形的多边形。最终的形状不应该是凸面的。换句话说,海报寻找的目标区域是凸包的严格子集。 Svante的算法通过寻找_minimum_change_的角度(角度的模数,如果你喜欢)来避免这种情况,允许左右旋转。 – 2010-04-17 10:48:49