当前位置: 首页 > 知识库问答 >
问题:

给出2个坐标,说出一个人要去的方向(左/右)

滑弘扬
2023-03-14

如果你有一个坐标系或地图(或者一个2D数组,如果你愿意的话),并且每个单元的编号从[0,0]到[m,n]。在给定起点和终点坐标的情况下,如何判断每一步要走的方向?如果不在网格的边界(北、南、西北等),可以向8个方向移动。所以没有上升或下降,只有左/右等。

目标是有一个“向右走”、“向左走一半”的序列。。。到达目的地时,要考虑自己一直在看哪个方向。例如,如果一个人正朝地图的左边看,并向前移动,那么他将与正在查看网格但向左移动的人落在同一个单元格中。

示例

从[0,0]到[2,1]。为了便于说明,我画了两个步骤(如果你把这一步算进网格,也可以画三个步骤)。每个箭头还指示从哪个方向进入单元格,以及进入后的观察方向。例如,在[1,1]单元中,一个向东北方向看。

我希望这不是太离题,但在我看来这是一个编程问题。如何回答取决于你自己。我用Java实现了一个图形

共有3个答案

倪炎彬
2023-03-14

方向表

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++;
}

或者如果我们只是想弄清楚它是如何移动的,那就用斯派尔的建议。

有品
2023-03-14

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

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

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的查找表比我尝试的任何东西都简单得多,在旋转更新中使用它

杨和蔼
2023-03-14

要做的事情是将“当前方向”添加到流浪汉的状态中。我将使用枚举N,NE,E,。。。为了国家和行动方向。然后可以从表格中计算“方向”;我用一个(头)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”元组,得到的值是左/右/。。以西/东/的形式。。(这些方向不是全局性的,而是主观的),同时也是下一步的寻找方向。

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]);
    }
}
 类似资料:
  • 我在研究空间日期时遇到了一个问题。我有一个包含列的表:对象id及其坐标(纬度和经度,数据类型是几何体)。我需要按照从西北到东南方向的坐标对这些数据进行排序。我该怎么做?我想我当然需要使用“orderby”和索引。但是哪一个和如何?

  • 问题内容: 我从http://www.movable-type.co.uk/scripts/latlong.html实现了“轴承”公式。但这似乎非常不准确- 我怀疑我的实现中存在一些错误。您能帮我找到它吗?我的代码如下: 问题答案: 您将括号放在错误的位置。 您正在将度数添加到以弧度为单位的值,这将不起作用。将为您完成从弧度到度的转换, 然后 在获得度值后进行归一化。 你有: 但是您需要: 也请记

  • 假设我想以这样的方式在Java中制作一个按钮,这样当你点击它时,就会出现一个JPopupMenu。它出现的相关代码是,它使JPopupMenu的左上角显示在按钮的中心,如下所示: 不过,我希望它的左下角位于按钮的中心,有点像iTunes的做法(左下角下方有一个按钮,大小与左侧的按钮相同): 我试图通过获取JPopupMenu的高度并将其添加到弹出菜单正在显示的y坐标来实现这一点,但我发现JPopu

  • 有人能给我一个如何用PDFBox提取“单词”坐标的例子吗 我正在使用此链接提取单个角色的位置:https://www.tutorialkart.com/pdfbox/how-to-extract-coordinates-or-position-of-characters-in-pdf/ 我正在使用此链接提取单词:https://www.tutorialkart.com/pdfbox/extract

  • 所以我想在10x10坐标系中转换不同支点之间的三个点 想象我想要什么: 这是我的第一个坐标系 翻译成: 现在,这些点必须保持在不同系统之间的同一点上,因此只有这些点的坐标应该更改。首先,我想我应该把之前的原点添加到转换后的坐标中,这对A和B是有效的,但C是不同的,也许我使用了一个错误的公式或其他东西 请你帮帮我

  • 我试图让两个元素,一个按钮和一个标签,在JavaFX中的一个HBox中有它们自己的单独对齐。到目前为止我的代码: 默认情况下,hbox将两个元素推到左侧,彼此相邻。 我也可以做css,如果-fx-stylesheet的东西是这样工作的。