给出2个坐标,告诉你哪个方向(左/右)

时间:2015-01-01 17:39:37

标签: java graph coordinates

如果你有一个坐标系或地图(如果你愿意的话,还有一个二维数组),每个单元的编号从[0,0]到[m,n]。 如果给定开始和目标坐标,如何确定每个步骤的哪个方向?如果不是在网格的边界(北,南,西北等),可以去8个方向。因此,左/右等没有上升或下降。

我们的目标是让一系列的"向右走","向左半边",......到达目的地,考虑一个人正在看哪个方向所有时间。例如,如果一个人正在寻找地图的左侧并向前移动,那么一个人将与正在查看网格但向左移动的人在同一个单元中着陆。

示例

从[0,0]到[2,1]。出于说明的原因,我绘制了两个步骤(如果计算进入网格的步骤,则绘制三个步骤)。每个箭头还指示进入单元格的方向也是进入后看起来的方向。例如,在单元格[1,1]中,可以看到东北部。

enter image description here

我希望这不是太偏离主题,但在我看来这是一个编程问题。你如何回答由你决定。我在Java中将其实现为图形

3 个答案:

答案 0 :(得分:1)

要做的是添加"当前方向"到了流浪汉的状态。我将使用枚举N,NE,E,......作为状态和移动方向。那么"方向"可以从表中计算出来;我使用A(头)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"元组和你得到的值是左/右/ ..形式为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]);
    }
}

答案 1 :(得分:0)

这实际上取决于你如何实现你的移动算法,例如你可以向东移动,然后向东移动,最终在同一个地方,定向的顺序是可交换的。

然而,当你真正去编码时,你可以确保你总是按照一定的顺序浏览方向列表,例如在伪代码中:

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的查找表比我尝试的任何东西都要简单得多,请将其与旋转更新一起使用

答案 2 :(得分:0)

方向表

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的建议。