【问题标题】:Find all non-overlapping polygons in a list of edges/vertices在边/顶点列表中查找所有不重叠的多边形
【发布时间】:2011-11-06 08:56:28
【问题描述】:

我有一个边列表和一个顶点列表。每条边引用两个顶点,每个顶点维护一个边列表。

我想查找从此图表生成的所有非重叠多边形。

一个例子是

0,0) (4,0) (4,2) (4,4) (2,4) (2,2) (4,2) (6,2) (6,6) (0, 6) (0,0)

这条路径应该描述每条独特的边,在一些顶点上有碰撞。在实际图中,顶点是不同的。我需要的两个多边形是 (0,0) (4,0) (4,2) (2,2) (2,4) (4,4) (4,2) (6,2) (6,6) (0,6) 和 (2,2) (2,4) (4,4) (4,2)

【问题讨论】:

  • 我从您的描述中假设边/顶点与空间中的点相关联?
  • 是的,这是一个计算几何问题。
  • 另外,我认为深度优先搜索可能有效。
  • 当您说“非重叠多边形”时,如果您有描述两个重叠多边形的边会发生什么?您将其报告为由它们的交集组成的一个多边形,还是您都不报告它们?
  • 形成多边形的路径应该选择最紧密的闭环。这可以防止多边形重叠。

标签: algorithm polygon computational-geometry edge-detection vertex


【解决方案1】:

您所描述的是在图中找到所有最小电路的问题。 (我认为它恰好有一个几何模型是无关紧要的。)有一篇论文here 用于寻找最小电路。您可以在此基础上移除最小电路的边缘并再次运行算法。

this thread 中也针对有向图的情况讨论了该问题。您可以通过制作每个边的副本并将顶点反转然后将其视为有向图,从而将您的图转换为有向图。唯一的问题是每个多边形会被找到两次,每个遍历方向一次。您可以通过后处理步骤或在算法运行时通过一些巧妙的簿记来清理它。

【讨论】:

  • 我认为位置确实很重要,因为您可以有一个位于空间中的循环,以便每条边以某种方式与另一条边相交,而生成的多边形实际上不是由电路边组成的,但根据该电路中的边缘相交的位置,可以从更多的边缘中提取出来。这也可能对非平面图有问题。我可能是错的(也许我误读了你的答案),但由于这些原因,我认为这个解决方案行不通。
  • @Ted Hopp,我可能弄错了,但我认为这不是完全正确的算法。假设我有一组边: (0,0) (4,0) (4,2) (4,4) (2,4) (2,2) (6,2) (6,6) ( 6,0) (0,0)。在这种情况下,更大的多边形是自相交的。我不想要一个自相交的多边形。相反,我想要两个多边形:一个由 (0,0) (4,0) (4,2) (2,2) (2,4) (4,4) (4,2) (2,6) 描述(6,6) (6,0),另一个是 (2,2) (2,4) (4,4) (4,2)。在这种情况下,我需要重新使用最小电路中的所有边缘。
  • @Josh C:那么你需要做一个第一遍来检测所有的线段交叉点。完成此操作并将所有边缘拆分为不重叠的边缘后,您可以进行循环查找以从中取出所有多边形。
  • 我已经用不重叠的边设置了我的图表。看起来这个问题通常被称为“多边形检测”。有时,找到算法最难的部分是知道问题的名称。
  • @templatetypedef - 在原始问题的 cmets 中,Josh 表示将在预处理中删除相交边。这不会排除您描述的情况吗? Josh - 您评论中的两个解决方案中的第一个包含 (4,2) 和 (2,2) 之间的边,但您的输入中没有这样的边。
【解决方案2】:

嗯,我在想……

唯一特别感兴趣的顶点是具有两条以上边的顶点。要找到所有具有两个以上边的顶点是 O(n)。然后找到最紧密的闭环与在给定顶点处找到给定边和另一边之间的最小 theta 相同(如果顶点是 ccw,这是从当前边顺时针方向的最小角度)。为了找到所有最紧密的闭环,我需要在边数大于 2 的顶点处检查所有边 ccw 边对。这是跟踪的初始化。从那时起,跟踪将始终顺时针选择具有最小 theta 的下一条边。返回路径后,我将移动到根顶点中的下一个边对,然后再次路径。一旦检查了所有对,我将移动到边数大于 2 的下一个顶点。现在,如果我只能确定我是否落入已知循环而不是跟踪。也许如果路径的前两个顶点在已知多边形中以相同的顺序出现......

听起来怎么样?我知道它不是 djikstra,但它会起作用,并且希望比找到所有循环蛮力更快。

【讨论】:

    猜你喜欢
    • 2012-04-22
    • 2011-09-19
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    相关资源
    最近更新 更多