如果你有一个坐标系或地图(如果你愿意的话,还有一个二维数组),每个单元的编号从[0,0]到[m,n]。 如果给定开始和目标坐标,如何确定每个步骤的哪个方向?如果不是在网格的边界(北,南,西北等),可以去8个方向。因此,左/右等没有上升或下降。
我们的目标是让一系列的"向右走","向左半边",......到达目的地,考虑一个人正在看哪个方向所有时间。例如,如果一个人正在寻找地图的左侧并向前移动,那么一个人将与正在查看网格但向左移动的人在同一个单元中着陆。
示例
从[0,0]到[2,1]。出于说明的原因,我绘制了两个步骤(如果计算进入网格的步骤,则绘制三个步骤)。每个箭头还指示进入单元格的方向也是进入后看起来的方向。例如,在单元格[1,1]中,可以看到东北部。
我希望这不是太偏离主题,但在我看来这是一个编程问题。你如何回答由你决定。我在Java中将其实现为图形
答案 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的建议。