Path Finding Application Algorithm
我正试图开发一个映射我办公室的应用程序(就像谷歌地图一样,显示从一个座位到另一个座位的路径)。
据我所读到的,像dijkstra的算法,或者反向跟踪可以用来解决这个问题。但是这些算法需要一个二维矩阵(或其变体)作为输入。现在从应用程序的管理角度考虑,这个人只有办公室的平面图作为应用程序的输入。如何将这个楼层图转换成这些算法可以作为输入的东西?还是我完全错过了什么?
任何建议都将不胜感激。
型
实际上,矩阵不是必需的。图形也可以在运行时生成。通过简单地将图像转换为双色图像(其中一种颜色表示墙),可以将图像转换为墙和开放点的地图。您的要求如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | 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 |