算法帮助:走在地图的边界

时间:2013-05-25 17:09:19

标签: algorithm

我正在尝试为我玩的游戏开发一个在线地图编辑程序 地图的数据有点大。如果我发送每个方块的数据,则中等大小的地图数据接近1 mb。

我认为我能做的就是找到地图上的边界并根据它创建多边形。

目前我:

  1. 找到西北最边界并从那里开始。对于我的示例地图,它是(3,2)
  2. 然后,检查北,东,南,然后是西,然后转到没有1作为其数据的第一个未访问的位置。
  3. 如果没有未访问的位置,请转到历史记录中最靠后的位置。
  4. Sample Map
    Steps Taken

    这适用于北方地区。然而,当我到达南部地区时,它向北检查并发现它是一个未经访问过的地点并且去了那个地方。它混乱的坐标是13,11。

    显然,这并没有给我我想要的界限,也没有走完整个地图。所以,有些东西需要改变。

    我考虑过以与之前相同的操作顺序添加边界检查(NESW)。但是,也有可能搞砸了。

    Map2 - Boundary check

    在(13,11),它会向北检查并发现它是一个未被访问的位置。而这一次,那里有一个边界,所以它认为去那里是可以的。

    如何走完整个外边界?

    我确实看过这里提到的凸壳算法,但我认为这不是我需要的。我可能是不正确的,但这是我期望凸包的结果看起来像 Convex Hull 虽然这确实减少了地图的大小,但仍然有很多我不需要的数据。当我需要获取地图中项目的内部边界时,尺寸减小会丢失,因为它们也会不规则。

    那么,我如何确保我实际上走在外边界?

2 个答案:

答案 0 :(得分:1)

以下是我在评论中建议的答案的扩展。

  

想象一下,如果你在一个黑暗的迷宫中。你做了什么来确保你   穿越整个迷宫?简单,只感觉左边的墙;   左转是否可能;被迫时向右转。

好的,更确切地说:

  1. 在地图的边界找到一个起点,我想你已经知道了。
  2. 确保代表代理商的当前面对。 (上,下,左,右)
  3. 优先考虑相对运动方向,如下所示:(向左,向前,向右,向后)
  4. 如果可能,请按优先顺序移动。
  5. 走路时,请记下访问过的位置,作为答案的一部分。并且还要检查您是否已经回到访问过的地方以终止该计划。
  6. 编辑:更正优先级。在前进之前离开,而不是相反。

答案 1 :(得分:0)

不确定我是否遇到问题,但看起来外边框可以表示为正交法线向量数组。或者更确切地说。想象一下一个网格,其中地图方块属于单元格。让我们开始从左上角开始标记我们的部分从0开始。在该表示法中,外部边界的开始为pic。 1将是((3,2),(4,2)),((4,2),(5,2))等等。

每个属于两个单元格的部分,每个部分都是地图方块“1”而其他部分不是边框。您可以遍历网格并简单地收集它们。

然后你必须将它们分成几个周期。这很简单。如果两个部分具有一个共同坐标 - 它们属于单个循环。如果两个循环在它们的部分下面有一个共同的坐标 - 它们是一个循环,你只需将这些数据合并到另一个循环。

如果你有一组明确不同的周期,那么最长的周期就是你的外边界。

当然,如果地图是一个整体。