正如您可以看到下面的示例图片,我的问题是如何确定由一系列点形成的多边形。
在左图中,点序列为{A,B,C,D,E,A},因此它只形成1个多边形{A,B,C,D,E}。
在图片的右侧,一系列点是{A,B,C,D,E,F,A}。它创建了2个多边形{A,F, G }和{B,C,D,E, G },其中G是来自AB线和FE的交点。 / p>
我不仅对多边形的数量感兴趣,而且我还想知道从它创建的多边形信息(多边形的一系列点)。
此算法将在移动设备中实时使用,因此必须足够快才能进行计算。哦,一系列点将由用户的拖动触摸点生成。
假设:
我一直在考虑解决方案,并且为了查看交叉点,我坚持使用O(N ^ 2)解,N =边数。我可以做的优化是在一些区域内维护行集,所以我只是最小化可以相互计算的总行数。
至于提取形成多边形的解决方案,我仍然卡住了。
答案 0 :(得分:2)
首先,找到段交叉的所有点,并创建在那里结束的新段,以便不再有任何段交叉(除了它们的末端)。然后将其视为图形,并删除1度的每个顶点,直到所有这些都消失为止。
将所有细分的所有部分标记为未访问。对于每个未访问过的S
段(A, B)
,A, B, C, ..., A
步行S
总是在{{1}}侧(角度排序最小值或最大值)转弯。你刚刚发现了一个多边形。这将为您提供一个额外的多边形,即“所有其余的在平面上”。
总体复杂度O(n ^ 2)。
答案 1 :(得分:1)
这是一个可以帮助您的解决方案: -
- 查找多边形边线之间的交叉点。
- 制作包含相互作用和顶点的有向图,其中有向边作为多边形的边
- 执行DFS并维护另一个堆栈以放置访问的顶点。当访问顶点在DFS中重新访问时,然后弹出单独的堆栈直到 那个顶点。弹出的顶点是多边形的顶点。该 遇到访问顶点的次数是多边形的数量 形成和弹出的顶点按顺序排列 多边形。
醇>
时间复杂度: -
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)