【问题标题】:How to find all the polygonal shapes of given the vertices?如何找到给定顶点的所有多边形?
【发布时间】:2019-10-23 07:50:29
【问题描述】:

我有一个顶点列表,并且我知道它们之间的连接。我试图找到顶点的所有多边形。这些多边形不应重叠。

我做了一些研究,我认为我可以检测多边形形状,如果我可以顺时针遍历顶点,(或逆时针,没有区别)。 所以,我寻找解决方案以顺时针遍历顶点。我找到了similar topic 并尝试了建议的解决方案。但问题是在遍历顶点时,当有多个顺时针选项时,我无法决定选择哪条路径。

基本上,我想找到以下多边形:

* A, E, G, C, D, A
* E, F, G,  E 
* E, B, F, E

当我从 A 出发到 E 顶点时,如何决定选择 G 路径?

P.S:如果我的方法不适合这个问题,或者有更好/更简单的解决方案,我愿意接受与我不同的方法

【问题讨论】:

  • How can I decide to choose G path 我猜你不应该,你可以找到一个顶点数量最少的多边形,然后切割它(删除非共享边,或以某种方式将多边形标记为已删除)。然后找到顶点数量最少的下一个多边形,等等......
  • 是的,找到顶点数量最少的多边形将是另一种方法。但是,接下来需要回答两个问题: 1. 如何找到顶点数最少的多边形? 2.如何解决重叠问题?请参阅example image。在这种情况下,ABC、ABD、ACD、BCD。都有最少的顶点数。我如何决定丢弃 ABC 并保留其余部分?
  • 好的,在谷歌搜索“最短周期”时,我想我已经找到了您问题的答案:math.stackexchange.com/questions/8140/…
  • 您需要更清楚地解释“顶点的所有多边形”。例如,您为什么不选择 AECD?还是三角形ACD?为什么像 Delaunay 三角剖分算法这样的东西不适合您的目的?
  • @Renat 谢谢,这个问题有一个相关的问题(stackoverflow.com/questions/4023310/…),我认为这与我的相同。接受的答案与您建议的几乎相同。还提供了伪代码和代码的工作版本:gist.github.com/mastoj/750015 但是,它并没有解决我在之前的评论中提到的重叠问题。

标签: algorithm math geometry polygon planar-graph


【解决方案1】:

根据您的示例,您正在尝试查找平面图的 ,由其顶点和边定义。

步骤 1. 用一对有向边(弧)替换每个无向边,在两个方向上连接顶点。对于每条弧 (v1 -> v2) 找到一个 next 弧 (v2 -> v3),使得这两条弧在它们的 左侧 具有相同的面 - 这可以通过计算圆弧和轴(例如)OX 之间的 角度 并按顺时针(或逆时针)顺序排列它们来完成。将所有弧标记为“未使用”。

第 2 步。 拾起任何“未使用”的弧线,然后依次跟随下一条弧线,直到到达初始弧线的原点 - 你会得到一个循环,包围一张脸。您已经找到了一张包含所有弧线/顶点的新面孔。将此循环中的所有弧标记为“已使用”。重复直到没有“未使用”的弧线。

回到你的例子 - 你将有以下弧线:

A -> E, E -> A
A -> D, D -> A
B -> E, E -> B
B -> F, F -> B
C -> D, D -> C
C -> G, G -> C
E -> F, F -> E
E -> G, G -> E
F -> G, G -> F

下一个弧的示例:

  • (D -> C) 是 (A -> D) 的下一个弧
  • (C -> G) 是 (D -> C) 的下一个弧
  • (G -> E) 是 (C -> G) 的下一个弧
  • 等等……

这个算法会找到你所有的内部面孔加上一个外部面孔,由循环(A -> E,E -> B,B -> F,F -> G,G - > C, C -> D, D -> A)。您可以忽略这个外部面,但在某些情况下它可能很有用 - 例如,当您是一个给定的点并且您需要找到它相对于整个图表的位置时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2011-09-08
    • 2020-12-28
    • 1970-01-01
    • 2015-06-09
    • 2015-03-06
    • 2021-12-24
    相关资源
    最近更新 更多