在给定 2 个坐标的情况下判断一个人的前进方向 (left/right)

Tell which direction one is going (left/right) given 2 coordinates

如果您有一个坐标系或地图(如果您愿意,也可以是一个二维数组)并且每个单元格的编号从 [0,0] 到 [m,n]。 在给定起点和终点坐标的情况下,如何判断每一步 的前进方向?如果不在网格的边界(北、南、North-West 等),一个人可以走 8 个方向。所以没有上涨或下跌只是 left/right 等

目标是"Go right"、"Go half-left"、...一直到目的地考虑到人们一直在看哪个方向。 例如,如果一个人正在看向地图的左侧并向前移动,那么他将落在与正在查找网格但向左走的人相同的单元格中。

例子

从 [0,0] 到 [2,1]。出于说明原因,我画了 2 个步骤(如果将步骤计算到网格中,则绘制了 3 个步骤)。每个箭头还告诉我们从哪个方向进入单元格以及进入后看的方向。例如在单元格 [1,1] 中看起来 North-East.

我希望这不是太过分 off-topic,但在我看来这是一个编程问题。你如何回答取决于你。我将其实现为 Java

中的图表

这实际上取决于您如何实现您的移动算法,例如您可以向东移动,然后向东北移动,并最终到达同一地点,方向的顺序是可交换的。

但是,当您实际编写代码时,您可以确保始终按特定顺序浏览方向列表,例如在此处的伪代码中:

while(!atDesintaion): //every iteration is a step
    //work out direction from with reference to the background
    direction = "";
    if(destinationY >currentY) {
        currentY++; //move north
        direction = "North";
    }
    else {
        currentY--; //move south
        direction = "North";
    }
    if(destinationX >currentX) {
        currentX++; //move east
        direction += "East";
    }
    else {
        currentX--; //move west
        direction += "West";
    }

    rotation = "North";
    if(currentAngle >= 0 && currentAngle < 22.5 || currentAngle >= 337.5 && currentAngle <= 360) rotation = "North";
    else if(currentAngle >= 22.5 && currentAngle < 77.5) rotation = "NorthEast";
    else if(currentAngle >= 77.5 && currentAngle < 112.5) rotation = "East";
    etc...
    else if(currentAngle >= 292.5 && currentAngle < 337.5) rotation = "NorthWest";

   if(rotation != "North") {
       switch(rotation) {
           case NorthEast: 
               switch(direction) {
                   case North: direction = "NorthEast";
                   case NorthEast: direction = "East";
                   etc...
               }
           case East: 
               switch(direction) {
                   case North: direction = "East";
                   case NorthEast: direction = "SouthEast";
                   etc...
               }
           etc...
       }
   }
}

如果你运行通过任何起始坐标和任何目标坐标,它将首先沿对角线移动,直到它不能然后在剩余的 4 个方向之一,直到它到达目标,这样每一步都可以跟踪它刚刚移动的方向

编辑:@laune 的查找 table 比我尝试的任何方法都简单得多,使用它进行轮换更新

Table 条路线

x+, y=     right
x-, y=     left
x=, y+     up
x=, y-     down
x+, y+     up-right
x+, y-     down-right
x-, y+     up-left
x-, y-     down-left

您可以使用某种 if 语句来确定移动方向

if (userinput == up) {
    y++;
}

或者如果只是想弄清楚它是如何移动的,请使用 spyr 的建议。

要做的事情是将 "current direction" 添加到 Hobo 的状态。我将使用枚举 N、NE、E... 来表示状态和移动方向。然后 "direction" 可以从 table 计算出来;我用 A(head) H(alf)L(eft), L(eft)

          Hobo faces
        N  NE  E  ...
    ------------------
Dir N | A  HL  L  ...
    NE| HR A   HL ...
    E | R  HR  A  ...
    ...

TomTom 建议的实现方式

此 HashMap 中的键是 "LOOKING_DIRECTION" + "GLOBAL_MOVE_DIRECTION" 元组,您获得的值是 left/right/.. 形式为 west/east/.. (这些方向不是全局的,而是主观的),同时也是下一步的寻找方向。

HashMap<String, String> DIR_CONVERTER = new HashMap<>();

String[] directions = {"N", "NE", "E", "SE", "S", "SW", "W", "NW"};

for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
        DIR_CONVERTER.put(directions[i]+directions[j], directions[(j+8-i)%8]);
    }
}