从二维网格上的碰撞数据构建距离图
Posted
技术标签:
【中文标题】从二维网格上的碰撞数据构建距离图【英文标题】:Building a distance map from collision data on a 2d grid 【发布时间】:2021-06-16 19:31:07 【问题描述】:正如标题所说,我有一个表示二维网格的数组,其中包含可步行/不可步行数据。
从该数组中,我想创建一个新数组,其中的整数表示到最近的不可行走节点的步数。
我现在要做的是让网格中的每个节点检查半径为 1、2、3 的所有邻居,依此类推,直到我们遇到一个不可行走的节点。但是因为我需要检查所有节点和多个邻居,所以速度很慢。
我想要完成的是图像中的数字。红色代表不可行走的节点。 Grid example
有没有快速的方法来做到这一点? 如果这很重要,我是在 c# 中执行此操作,但如果我得到任何其他语言的示例,我可能会弄明白。
【问题讨论】:
【参考方案1】:对此有一个有效的算法。不幸的是,我找不到对它的名称的引用。它基本上分为两个通道。假设不可步行节点的值为零,而可步行节点最初具有最大值:
-
从左上角开始
从左到右,从上到下处理每个节点
取值的最小值到顶部和左边的值
值加一
如果该值小于当前节点值,则使用该值更新节点。
重复该过程,但从右下角开始,以相反的顺序处理节点,并检查右下角的值。
这假设您现在允许对角线遍历,但如果需要,该方法可以适用于此。
【讨论】:
这是一种简单但超级聪明的解决方案,让我觉得我永远学不会编程 :)【参考方案2】:是的,从所有无法行走的单元格开始运行 BFS。
您将所有无法通过的单元格添加到队列中。当队列不为空时,您获取第一个元素,通过查看它的邻居并添加 1 来计算距离(如果它不可步行,您可以将其设置为 0)。然后将所有未见过的邻居添加到队列的末尾并将它们标记为已看到。
这在时间和空间上都是 O(N*M) 复杂度。在这种情况下,只有邻居相邻的网格,这是 O(N),因为边缘的上限约为 2N。
【讨论】:
以上是关于从二维网格上的碰撞数据构建距离图的主要内容,如果未能解决你的问题,请参考以下文章