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)
重新进行距离传播。
我此处给出的做法是:一旦有障碍物被删除,则只将那些被删除障碍标记的格子“格式化”。当存在多个障碍物时,每个障碍物影响不同区域的栅格。只有那些被删除障碍物标记的格子才需要重新计算距离值。