Improved updating of Euclidean distance maps and Voronoi diagrams问题

问题遇到的现象和发生背景

PRN(20201012):Improved updating of Euclidean distance maps and Voronoi diagrams问题

问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

通过读您对于这篇论文的解读,想要问您一个问题,即在整个地图中,是否Raise状态是只有碰到了边界或被占用的格子,才会停止传播raise并反向传播lower,并且传播lower的过程,是否为,所有的被占据的格子都要反向传播lower,有更省算力的方案吗

好学校

有更省力的方案,先贴出更新后的代码:


def Raise(i,j):
    for ni in [-1, 0, 1]:
        for nj in [-1, 0, 1]:
            if ni == 0 and nj == 0:
                continue
                
            xi = i + ni
            xj = j + nj
            if xi < 0 or xi >= 30 or xj < 0 or xj >= 30:
                continue
                
            if (obst[xi, xj] >= 0) and (toRaise[xi, xj] == 0):
                oi, oj = S2IJ(obst[xi,xj])  
                if (obst[oi, oj] == -1): # 将原条件  ((oi != xi) or (oj != xj)): 替换
                    dist[xi,xj] = 99999.0
                    obst[xi, xj] = -1
                    toRaise[xi, xj] = 1
                process[xi, xj] = 1
    toRaise[i,j] = 0

上面将论文中raise(s)算法中的第17行(原博客Python实现也是与原文献保持一致的)更改如上代码:将if (oi != xi) or (oj != xj): 替换成if (obst[oi, oj] == -1): .。更改后,删除一个障碍物的时间成本由原700ms降低为140ms。

原文献的做法是(和你理解的一样):一旦障碍物被删除,则将地图中所有不被障碍物占据的格子“格式化”,然后再调用距离传播函数lower(s)重新进行距离传播。
我此处给出的做法是:一旦有障碍物被删除,则只将那些被删除障碍标记的格子“格式化”。当存在多个障碍物时,每个障碍物影响不同区域的栅格。只有那些被删除障碍物标记的格子才需要重新计算距离值。

img