从二维网格上的碰撞数据构建距离图

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。

【讨论】:

以上是关于从二维网格上的碰撞数据构建距离图的主要内容,如果未能解决你的问题,请参考以下文章

一张图搞定SDF的概念

激光SLAM

如何计算 geohash 上的相邻网格。需要算法

unity网格碰撞器接缝问题

networkx 通过欧几里得距离阈值构造图

在二维网格上寻找最近​​物体的算法