我正在尝试开发一个映射我办公室的应用程序(就像谷歌地图这样的应用程序,显示从一个座位到另一个座位的路径)。
从我到目前为止所读到的内容,可以使用 Dijkstra或Back Tracking 等算法来解决问题。但是这些算法需要某种2D矩阵(或其变体)作为输入。现在从管理的应用角度思考,该人只有办公室的楼层地图作为输入提供给应用程序。如何将这个楼层地图转换为这些算法可以作为输入的东西?或者我完全错过了什么?
任何建议都将不胜感激。
答案 0 :(得分:1)
实际上不需要矩阵。该图也可以在运行时生成。通过简单地将图像转换为双色图像,可以将图像转换为墙壁和开放点的地图,其中一种颜色代表墙壁。这看起来符合您的要求:
define node: (int x , int y)
define isWall:
//this method is actually used for imageprocessing
//i've forgotten the name of it, so if anyone knows it, pls comment
input: int rgb
output: boolean wall
int red = red(rgb)
int green = green(rgb)
int blue = blue(rgb)
int maxWallVal//comparison value
return (red + green + blue) / 3 < maxWallVal
define listNeighbours:
input: node n , int[][] img
output: list neighbours
int x = n.x
int y = n.y
list tmp
if x + 1 < img.length
add(tmp , (x + 1 , y)
if x > 0
add(tmp , (x - 1 , y)
if y + 1 < img[x].length
add(tmp , (x , y + 1)
if y > 0
add(tmp , (x , y - 1)
for node a in tmp
int rgb = img[a.x][a.y]
boolean wall = isWall(rgb)
if NOT wall
add(neighbours , a)
return neighbours
define findPath:
input: node start , node end , int[][] img
output: list path
set visited
map prevNodes
queue nodes
add(nodes , start)
while NOT isEmpty(nodes)
node n = remove(0 , nodes)
if n == end
break
add(visited , nodes)
for node a in listNeighbours(n)//list all neighbour-fields that are no wall
if contains(visited , a)
continue
add(queue , a)
put(n , a)
node tmp = start
while tmp != null
add(path , tmp)
tmp = get(prevNodes , tmp)
return path