我目前正在使用java编写一个自动机器人,这是我的问题;
我想知道我的机器人在任何时候的方向,考虑到只有4种可能的方向:
上/下/左/右
我使用以下数字定义每个位置:
向上和向下= 0,左= 1,右= -1
所以说我的机器人当前面向“0”(比如说),然后我在右边转90度,然后值应该变为1.如果我再次向右旋转90度,它将变回0。
所以我们有以下顺序:0,-1,0,1(我们可以从任何一点开始)。
基本上我的机器人会遇到不同类型的障碍物。每当他遇到一个,他就会向右或向左转。我希望他总是试着转向“向上”的方向。如果机器人在处于“0”位置时转动,则无关紧要,因为它不会影响Y位置(如果我们考虑X-Y轴)。但如果他在1或-1位置,那么他将不得不转90°* 1或90°*( - 1)。
我正在努力寻找如何根据机器人旋转的右侧(或左侧)有多少“象限”来正确更改我的CURRENT值。我想到了(-1)的指数,但我无法弄清楚如何。
你可以帮我解决这个问题吗?谢谢!
P.S。我知道我可以用if条件检查值,但是有很多不同的类,我使用了很多次旋转方法,所以它需要尽可能短而简单。
答案 0 :(得分:2)
您的问题似乎是尝试鼻窦或余弦函数的良好候选者。
如果您将问题用作象限,则可以使用窦的特征:
CREATE INDEX some_name
ON dexwhs.d_account_veeva(account_dim_key, effective_start_dt)
在这种情况下,0和180度分别为0(N和S),E - W分别为1和-1。
这可以帮到你吗?
答案 1 :(得分:0)
你可以使用一些枚举来做你需要的事情:
enum Orientation {
NORTH, EAST, SOUTH, WEST;
// clockwise
public Orientation turnRight() {
Orientation[] values = values();
int ordinal = this.ordinal();
if (ordinal == values.length - 1) {
return NORTH;
}
return values[ordinal+ 1];
}
// counter-clockwise
public Orientation turnLeft() {
Orientation[] values = values();
int ordinal = this.ordinal();
if (ordinal == 1) {
return WEST;
}
return values[ordinal - 1];
}
}
(Live demo)。
如果需要数值,只需在枚举中添加一个字段(和构造函数):
enum Orientation {
NORTH(0), EAST(1), SOUTH(0), WEST(-1);
private final int foo;
private Orientation(final int foo) {
this.foo = foo;
}
// getter for "foo"
然后Orientation.NORTH.turnLeft().turnLeft().turnLeft().getFoo()
;