【问题标题】:Finding the inner-most path of a polygon寻找多边形的最内层路径
【发布时间】:2021-03-11 00:39:41
【问题描述】:

给定一个无向顶点图,我需要找到连接两个特定点的最内层路径。我最初的想法是只使用类似 Dijkstra 的算法来找到最短路径,但是在很多情况下最短路径不是最里面的。这是我想要实现的目标的视觉效果:

最终,我试图根据在我的程序中绘制的墙壁生成“房间”。所以在这张图片中,虚线是我正在绘制的最后一条边,然后它应该找到从顶点 1 到顶点 7 的边路径(遮挡虚线边),这将给我路径 1-2-3-4- 5-6-7。如果我使用当前的解决方案,最短路径将是 1-2-8-6-7,但显然,这不是最里面的路径。

我试图对此进行广泛研究,但似乎找不到答案。我还尝试在每个节点处选择要遍历的最低边角,但这仅适用于沿一个方向行进,因为我目前没有确定它是顺时针还是逆时针遍历节点的方法。值得注意的是,我正在 Lua 中尝试这样做,但也欢迎使用伪代码或类似的高级语言!

如果我能澄清任何事情,请告诉我。

【问题讨论】:

  • 首先计算每个有向边的角度 (0-360)。
  • I have no current way of determining whether it traverses clockwise or counterclockwise - 您可能会收到两种不同的解决方案:顺时针和逆时针,两者都是“最内层”
  • @DavidEisenstat 是的!

标签: algorithm lua polygon graph-theory


【解决方案1】:

基本上,您想要的是枚举入射到平面直线图面上的边。

首先你需要一个嵌入:对于每个节点,按逆时针顺序对进入它的边进行排序,例如,5→6、8→6、12→6、7→6。 (如果你喜欢使用余弦定律,你可以避免触发。)然后将后继存储在一个大映射中:(5→6):(8→6),(8→6):(12→6),(12) →6):(7→6),(7→6):(5→6),(1→7):(6→7)等

其次,要找到一条有向边右侧的面,按逆时针顺序重复找到下一条有向边并将其反转,直到回到起始边。例如,1→7、6→7、7→6、5→6、6→5、4→5、5→4、3→4、4→3、2→3、3→2、1→2 , 2→1, 7→1, 1→7。

现在,这里有点复杂,如果你从 7→1 开始,你将围绕无限面循环:7→1、10→1、1→10、9→10 等。处理这个问题的方法是计算面部的签名区域。如果它是负数,那么我们很好,因为我们按顺时针顺序枚举了有限面。如果它是正数,那么我们需要另一个面,因为我们按逆时针顺序枚举无限面。

如果两个事件面都是有限的,你必须告诉我你想要什么。

【讨论】:

  • 您有什么方法可以解释我将如何计算面部的签名区域吗?或者将我引导到可以更好地解释该概念的资源?
猜你喜欢
  • 2012-12-28
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
相关资源
最近更新 更多