我已经实现了使用Dijktra's Algorithm
的代码。感谢Dijkstra,我可以打印从所需源到所需目的地的最短路径。但是,我想要做的是添加一个功能,告诉我们向左转的方向,右转命令。
示例:
假设A位于1号街,B位于2号街,D位于2号街左侧60米处。
转到街2。转左 。走约60米。它将在你的身上 左
我需要你的想法。谢谢!
答案 0 :(得分:0)
要从路径生成驾驶指令,您需要使用图表存储其他信息:
对于每条道路,它的长度。这很简单
对于每个十字路口,每对事故道路之间的关系。
你可以存储十字路口周围的每条道路的方位角(1-2路从交叉路口1向西),然后从两条道路之间的相对角度,十字路口的类型(正常/环形交叉口)和拓扑排序和所有其他道路的相对角度。
这种方法具有更紧凑的表示方式,但需要更多编程。
或者,您可以分别存储每对之间的关系。这是更可靠的(只有人类可以真正理解世界上每种可能的十字路口类型的复杂性),但它更加手动更新(毕竟,理论上可以推迟十字路口类型的一点AI ,即使有错误)。
如果你有一张巨大的地图,你会想要坚持第一种方法。如果你手动构建地图,你可能更喜欢第二个 - 只是确保不会在每个道路对中存储字符串(除非它们被语言加入),或者你的内存需求可能扶摇直上。在将地图序列化为文件时,这需要特别注意(同样,如果您选择,ZIP压缩可能会在很大程度上缓解这种情况。)
如果您的地图只关注简单的4向十字路口,那么每对存储的信息只是left/straight/right
枚举(方法#2),或者仅仅是十字路口边缘的排序(方法) #1)某些道路可能是null
。
例如,您的十字路口(最简单的情况,方法#1)看起来像
private Road[] roads = new Road[4];
public enum Direction{
Left, Straight, Right, Back;
// utility methods
}
public Direction getDir (Road from, Road to){
// input checking stripped for clarity
int iFrom = roads.indexOf(from);
int iTo = roads.indexOf(to);
// more input checking
int iDiff = (iFrom - iTo) % 4;
if(iDiff < 0) iDiff +=4 ;
return Direction.getRelative90(iDiff);
//Direction.getRelative90 is just a switch statement.
}
要生成路线,请使用地图中存储的信息。记住要连接逻辑上遵循的道路(总结它们的长度)(在该交叉点没有指示=隐含“直行” - 一条道路可能跟随一条道路,但每条道路只应跟随一条道路),其余道路很简单。