2

我试图找到一个在网格上表示对象方向的编程概念,但我的逻辑在这里严重失败。如果我有机器人(R)并且他面向北方,我希望他左右转并相应地改变方向。显然,这需要在一个循环中(可能是一个循环链表),如果 R 面向西方但我向右转,那么 R 需要返回面向北方。

我已经看到了这个答案Position andorientation of robot in a grid并且我已经使用数组做了类似的事情,但它似乎不正确。必须有更好的方法来做到这一点。

在谷歌上查找这个只是给我定向编程链接或非常复杂的机器人设计论文。

提前致谢!

4

2 回答 2

1

由于您没有针对特定语言提出问题,因此我可以建议我将执行的操作的 oo 伪代码版本:

class Orientation2d
{
   int direction = 0;
   static Position2d[4] move = { {0,1}, {1,0}, {-1,0}, {-1,-1} };

   void left()
   {
       direction = (direction+4-1) % 4;
   }
   void right()
   {
       direction = (direction+1) % 4;
   }
   Pose2d forward()
   {
      return move[ direction ];
   }
}

class Pose2d
{
   Position2d pos;
   Orientation2d or;

   void moveForward()
   {
       pos += or.forward();
   }
   void turnLeft()
   {
       or.left();
   }
   void turnRight()
   {
       or.right();
   }
}

您应该能够轻松地将其转换为 C++ 或 Java。

于 2013-08-19T07:29:50.387 回答
0

执行此操作的方法是通过枚举,类似于您为一周中的日子设置样式的方式。它们处于某种循环中,您可以使用枚举选项映射关联的字符。

public enum CardinalPosition {
    NORTH('N'), EAST('E'), SOUTH('S'), WEST('W)

    private CardinalPosition left;
    private CardinalPosition right;

    // here you set each left and right per enum value
    private void setupRight() {
        NORTH.right = CardinalPosition.EAST;
        ...
        WEST.right = CardinalPosition.NORTH;
    }

    private void setupLeft() {
        EAST.left = CardinalPosition.NORTH;
        ...
        NORTH.left = CardinalPosition.WEST;
    }

    // so the rotateLeft and rotateRight would just return the left and right values of the given CardinalPosition

}
于 2013-10-09T00:17:01.333 回答