删除多边形中的孔

时间:2009-11-12 12:47:08

标签: geometry polygon point-in-polygon

我有一个由点数组确定的多边形。

这个多边形正在交叉,在多边形本身形成一些洞。

我的问题是:如何省略这些洞并获得多边形的外部点?

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

提前致谢,

/罗杰

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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

现在包含多边形的所有外点。你必须做一些极地数学,但这很简单。按极性排序排序他们的余切点上的所有点都是最低点。我忘记了检查右转弯的代码,但如果您只是搜索Graham-Scan,它就在互联网上。希望这有帮助!