【问题标题】:Delete holes in a Polygon删除多边形中的孔
【发布时间】:2009-11-12 12:47:07
【问题描述】:

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

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

我的问题是:我怎样才能省略这些洞而只得到多边形的外部点?

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

提前致谢,

/罗杰

【问题讨论】:

  • 这些边界点是否按特定顺序考虑?或者你只是递给他们一袋子并告诉'制作多边形'?

标签: geometry polygon point-in-polygon


【解决方案1】:

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

【讨论】:

  • 有没有样本可以消除多边形的交集?
【解决方案2】:

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

执行此操作的一种算法是复杂度为 O(nlgn) 的 Graham-Scan。来自科门:

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 现在包含多边形的所有外部点。你必须做一些极地数学,但这很简单。要按极坐标排序,将所有点与您的最底点的余切点进行排序。我忘记了检查右转的代码,但如果你只是搜索 Graham-Scan,它就在互联网上。希望这会有所帮助!

【讨论】:

  • 考虑一个大致 L 形的多边形。生成的形状不应该是凸的。换句话说,发布者寻找的目标区域是凸包的严格子集。 Svante 的算法通过寻找角度中的 minimum_change(角度的模数,如果您愿意)来避免这种情况,允许左转和右转。
猜你喜欢
  • 2019-03-10
  • 2019-02-01
  • 2010-09-26
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
相关资源
最近更新 更多