如何在OOP中表示N E S W方向?

时间:2013-08-13 17:49:25

标签: oop logic orientation robotics

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

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

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

提前致谢!

2 个答案:

答案 0 :(得分:1)

由于你没有问一个特定语言的问题,我可以建议我会做的oo-pseudocode版本:

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。

答案 1 :(得分: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

}