在地图中左转右转命令

时间:2012-12-27 19:30:45

标签: map path routes directions

我已经实现了使用Dijktra's Algorithm的代码。感谢Dijkstra,我可以打印从所需源到所需目的地的最短路径。但是,我想要做的是添加一个功能,告诉我们向左转的方向,右转命令。

示例:

从A到D:

  

假设A位于1号街,B位于2号街,D位于2号街左侧60米处。

从A到D:

  

转到街2。转左 。走约60米。它将在你的身上   左

我需要你的想法。谢谢!

1 个答案:

答案 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.
}

要生成路线,请使用地图中存储的信息。记住要连接逻辑上遵循的道路(总结它们的长度)(在该交叉点没有指示=隐含“直行” - 一条道路可能跟随一条道路,但每条道路只应跟随一条道路),其余道路很简单。