【问题标题】:Find all polygon faces given a few diagonals找到给定几个对角线的所有多边形面
【发布时间】:2017-04-05 12:43:04
【问题描述】:

我们有一个多边形,以从最底部开始的逆时针方向的顶点列表形式给出 (points)。给出了同一多边形的一些对角线(它们都不相交),作为一组点(diagonals)。

我们必须找到多边形被切割成的所有面(作为每个面的顶点列表)。

示例:

输出将包括以下面孔:

face1 = [(-68,-36), (-53,-40), (-39,44)]
face2 = [(-53,-40), (-21,37), (-12, 6), (-5,49)]
...

您可能已经注意到,对角线将多边形相对于 x 轴切割成monotone polygons。如果无论如何这可能会有所帮助。

我已经解决这个问题几个小时了。我似乎找不到任何与它相关的问题。任何帮助将不胜感激,谢谢。

编辑:问题可以简化为在图中找到所有简单的循环(即无弦循环)。我发现了这些类似的问题:

Finding polygons within an undirected Graph

Find all chordless cycles in an undirected graph

但是,第二个中公认的解决方案似乎不起作用。

【问题讨论】:

  • @PM2Ring ,在这里计算所有周期无济于事,因为一张脸可能是许多周期的一部分。多边形本身就是一个循环。
  • 公平点。我想你可以找到所有周期,然后将它们减少到基本周期。但是,您没有有一个无向图,您有一个有向图,这使任务变得容易得多。
  • 将其作为有向图仍然存在问题。取最左边的对角线(-53,-40) -> (-68,-36)。我的方向是从右到左。现在,这条对角线将成为最下面的面的一部分,但face1 将不再是一个循环(多边形是逆时针的)

标签: algorithm graph geometry graph-theory polygons


【解决方案1】:
  1. 从整个多边形开始。

  2. 取第一条对角线并将多边形一分为二。一个点将到达对角线的第一个点,然后是(包括)对角线的第二个点之后的所有点。另一个将具有对角线的第一个点以及直到(包括)对角线的第二个点的所有点。

  3. 取下一个对角线,决定哪个多边形将被分割(它只能是一个,因为对角线不交叉)并按照步骤 2 中的描述进行分割。

  4. 重复 3. 直到处理完所有对角线。

【讨论】:

  • 谢谢!这很有效并且很容易实现。很好地利用了对角线将每个面切成两块这一事实。
  • @Rahul 这个事实是"Jordan Curve Theorem"
猜你喜欢
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 2021-09-21
  • 2011-02-18
  • 2022-11-21
  • 1970-01-01
  • 2010-12-03
  • 2020-12-28
相关资源
最近更新 更多