【问题标题】:How to calculate number of polygons that are formed by sequence of points in 2D?如何计算由二维点序列形成的多边形数量?
【发布时间】:2014-01-21 11:28:27
【问题描述】:

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

  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 线的交点。

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

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

假设:

  1. 仅由 2 个共线点组成
  2. 它并不总是闭合链多边形。比如右图,点序列是{A, B, C, D, E, F},没有边FA。

我一直在思考解决方案,为了寻找交叉点,我坚持使用 O(N^2) 解决方案,N = 边数。我可以从中进行的优化是保持某些区域内的线组,所以我只是最小化可以相互计算的总线。

至于提取形成什么多边形的解决方案,我还是卡住了。

【问题讨论】:

  • 你有坐标,对吧?
  • 假设是什么?它总是一个封闭的多边形链吗?
  • 共线点不超过两个?
  • @BartoszMarcinkowski:是的,我有坐标,它总是一个封闭的多边形链
  • @VikramBhat:好吧,为了简化问题,是的,不超过 2 个共线点

标签: algorithm graph-algorithm


【解决方案1】:

首先,找到所有线段交叉的点并创建新的线段,以使线段不再交叉(除了它们的末端)。然后将其视为一个图,并删除每个 1 度的顶点,直到所有这些都消失。

将所有段的所有边标记为未访问。对于分段(A, B) 的每个未访问侧S 步行A, B, C, ..., A 总是轮到您S 侧的最多(角度排序最小或最大)。你刚刚找到了一个多边形。这将为您提供一个额外的多边形,即“平面上的所有其余部分”。

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

【讨论】:

  • 我不认为你可以得到一个 1 度的顶点,因为之前和之后的所有东西都连接到顶点(并且 A 在最后一个顶点之后)。
  • @Agung 说它并不总是一个封闭的多边形链。
  • 我认为您的解决方案将受益于对整体复杂性的分析 - 特别是显示查找所有交叉点的复杂性。其次,我认为您可能会遇到两个十字路口完全相同的问题。
  • 好的,我将编辑具有整体复杂性的帖子。至于“同一个地方”——我认为这不是问题。
  • 但是边缘被画到了右边的图片中。我认为他的意思是,优势不一定是给我们的。
【解决方案2】:

这是一个可能对您有所帮助的解决方案:-

  1. 查找多边形边线之间的交点。
  2. 制作包含交点和顶点的有向图,有向边作为多边形的边
  3. 执行 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)

【讨论】:

  • 如果最大可能的交叉点数为 O(n^2),如何在 O(n log n) 中找到所有交叉点? (如果每个线段都相互交叉,除了相邻的两个)
  • 更重要的是,图的大小不是 O(n),因为它包含每个交点的顶点。该图的 DFS 时间复杂度也是 O(n^2)。
  • @BartoszMarcinkowski 对不起,但我说的是一般情况,我不是在这里证明最坏的情况,我很乐观,说 O(N^2) 交点非常罕见。请问你能给出四边多边形中的 16 个相交吗?
  • O(n^2) 并不意味着我可以给你 4 个边的 16 个交叉点。 n 边可能有多少个交叉点的确切值是 (n-1)*(n-2)/2,对于 n=4,它是 3,但对于 n=100,它是 4851。平均情况取决于我们正在处理的数据类型,我们不知道。无论如何,我的观点是,你提到的“高效算法”是不存在的(除非我的计算是错误的),而且你的解决方案的复杂度是 O(n^2)。
  • @BartoszMarcinkowski 如果您不了解 O(nlogn) 算法,请搜索 Bentley-Ottmann。我们正在处理的数据类型是路径,它们大多没有那么多交叉点,你从哪里得到 (n-1)*(n-2)/2 请你解释一下,因为如果有那么多交叉点我怀疑您将有一条连接的路径,但只是一组线
猜你喜欢
  • 1970-01-01
  • 2010-10-01
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
相关资源
最近更新 更多