如何计算2D中点序列形成的多边形数量?

时间:2014-01-21 11:28:27

标签: algorithm graph-algorithm

正如您可以看到下面的示例图片,我的问题是如何确定由一系列点形成的多边形。

  1. 在左图中,点序列为{A,B,C,D,E,A},因此它只形成1个多边形{A,B,C,D,E}。

  2. 在图片的右侧,一系列点是{A,B,C,D,E,F,A}。它创建了2个多边形{A,F, G }和{B,C,D,E, G },其中G是来自AB线和FE的交点。 / p>

  3. 我不仅对多边形的数量感兴趣,而且我还想知道从它创建的多边形信息(多边形的一系列点)。

    此算法将在移动设备中实时使用,因此必须足够快才能进行计算。哦,一系列点将由用户的拖动触摸点生成。

    假设:

    1. 仅由2个共线点组成
    2. 它并不总是闭链多边形。例如,从右边的图片中,一系列点是{A,B,C,D,E,F},没有边缘FA。
    3. 我一直在考虑解决方案,并且为了查看交叉点,我坚持使用O(N ^ 2)解,N =边数。我可以做的优化是在一些区域内维护行集,所以我只是最小化可以相互计算的总行数。

      至于提取形成多边形的解决方案,我仍然卡住了。

      illustration

2 个答案:

答案 0 :(得分:2)

首先,找到段交叉的所有点,并创建在那里结束的新段,以便不再有任何段交叉(除了它们的末端)。然后将其视为图形,并删除1度的每个顶点,直到所有这些都消失为止。

将所有细分的所有部分标记为未访问。对于每个未访问过的S(A, B)A, B, C, ..., A步行S总是在{{1}}侧(角度排序最小值或最大值)转弯。你刚刚发现了一个多边形。这将为您提供一个额外的多边形,即“所有其余的在平面上”。

总体复杂度O(n ^ 2)。

答案 1 :(得分:1)

这是一个可以帮助您的解决方案: -

  
      
  1. 查找多边形边线之间的交叉点。
  2.   
  3. 制作包含相互作用和顶点的有向图,其中有向边作为多边形的边
  4.   
  5. 执行DFS并维护另一个堆栈以放置访问的顶点。当访问顶点在DFS中重新访问时,然后弹出单独的堆栈直到   那个顶点。弹出的顶点是多边形的顶点。该   遇到访问顶点的次数是多边形的数量   形成和弹出的顶点按顺序排列   多边形。
  6.   

时间复杂度: -

1. Finding all intersections take O(NlogN) if efficient algorithms are used
2. O(N) for making graph out of intersections and vertices.
3. O(N) for DFS

总复杂性: - O(NlogN)