【问题标题】:How to find polygons in a given set of points and edges?如何在给定的一组点和边中找到多边形?
【发布时间】:2016-12-20 15:06:59
【问题描述】:

考虑以下问题:

给定平面上的 N 个点和连接它们的 M 条线段,找出其中不包含任何其他多边形的所有多边形(凸面或凹面)。

例如:

建立了5个多边形:

1 - 2 - 5 - 6

2 - 3 - 5

3 - 4 - 5

7 - 8 - 9

10 - 13 - 20 - 12 - 11

如何识别这些多边形以及对应的顶点和边?最快的解决方案是什么?

【问题讨论】:

    标签: math geometry computer-science computational-geometry


    【解决方案1】:

    构建以线段末端为顶点、线段为边的图形,然后使用DFS 查找循环。

    请注意,相同的边可能属于多个循环(多边形),例如您的2-5,并且选择循环可能有很多变体。为了排除歧义,您可以构建fundamental set of cycles

    编辑。正如韦斯顿在 cmets 中注意到的那样,生成的多边形可能包含其他多边形。所以更多几何方法的草图:

    为图建立邻接列表。
    按极角对列表中的边进行排序。
    选择最底部的顶点A。
    如果度数为0,则删除顶点,如果为1,则删除顶点和边。
    否则得到与该顶点角度最小的边 E。

    步行到配对顶点 B。
    从 B 中选择最左边的 F。
    沿 F 边缘移动到 C。
    如果死路,移除F和顶点C,返回B。

    使用左手规则重复移动,直到遇到顶点 A 或死角顶点。
    在 walk 过程中,移除从 2 次顶点出边的边或将其标记为已使用。

    【讨论】:

    • 我知道它已被接受,所以 OP 对此很满意。但我还是有点不清楚,你能解释一下它是如何排除包含其他多边形的吗?
    • @weston Graph 方法无法帮助从几何角度选择最佳多边形集,而无需额外(可能是复杂的)努力。利用类似方法(用任何多边形覆盖点)对我的任务来说并不重要
    • 您能否进一步阐明算法,或者甚至可以帮助我们提供伪代码?因为我似乎也无法在互联网上找到其他类似的算法。例如,最底部的顶点,是指角度最小的顶点还是 y 坐标最低的顶点?最左边的顶点也是x坐标最低的顶点吗?我缺少的另一件事是“度数”实际上是指顶点的度数(即边数),而不是极角的度数。删除边缘意味着将其从两个 adjacencyLists 中删除?
    • 那么顶点 B 由 A + E 或左手定则结束(即增加极角)?那么最左边的F是什么意思呢?最左边的那个?然后算法总是选择下一个左顶点然后总是应用这个“度数去除规则”?还是只删除 2 级或更大的边缘?提前致谢
    • @MeFisto94 最底部的顶点是 12(最小 Y)。 20-13 之后的最左边是 13-10(逆时针顺序的最后一个)。是的,从 adj.list 中删除边缘。算法遍历“最里面”的多边形
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 2012-03-21
    • 2019-10-23
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多