【问题标题】:turn left turn right commands in map [closed]在地图中左转右转命令[关闭]
【发布时间】:2012-12-27 19:30:44
【问题描述】:

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

例子:

从 A 到 D:

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

从 A 到 D:

前往第 2 街。转左 。走大约 60 米。它会在你的 离开了。

我需要你的想法。谢谢!

【问题讨论】:

    标签: map path routes directions


    【解决方案1】:

    要从路径生成驾驶指令,您需要在图表中存储其他信息:

    对于每条道路,它的长度。这很简单

    对于每个十字路口,每对事件道路之间的关系。

    您可以存储十字路口周围每条道路的方位角(道路 1-2 从十字路口 1 向西行驶),然后根据两条道路之间的相对角度、十字路口的类型(普通/环形交叉路口)和所有其他道路的拓扑排序和相对角度。

    这种方法的好处是表示更紧凑,但需要更多的编程。

    或者,您可以单独存储每对之间的关​​系。这更可靠(只有人类才能真正理解世界上每种可能的十字路口类型的复杂性),但更新起来更加手动(毕竟,理论上有点人工智能可以推迟十字路口类型,即使有错误)。

    如果您有一张巨大的地图,您会想要坚持第一种方法。如果您手动构建地图,您可能更喜欢第二个 - 只需确保不实际存储每个道路对的 strings(除非它们被语言所占用),否则您的内存需求可能飞涨。在将地图序列化为文件时,这需要格外注意(同样,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.
    }
    

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

    【讨论】:

    • 是的,你是对的。我实现的道路是笔直的,我已经存储了交叉点。我很困惑,无法理解如何实现它。我也无法从互联网上找到任何有用的代码。你能给我一个代码示例吗?
    • @sesamos 我不能给你一个代码示例,因为你没有说任何语言。
    • 我正在用java写代码
    • 如果你不提供任何代码,你能指导我一个你知道的为此编写代码示例的网站吗?我在互联网上搜索了很多,但找不到任何东西..
    • 道路方位角是什么意思
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2012-05-27
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多