在给定 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]);
}
}
如果您有一个坐标系或地图(如果您愿意,也可以是一个二维数组)并且每个单元格的编号从 [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]);
}
}