2016-11-29 14 views
2

私は現在Javaで自律型ロボットをプログラミングしています。ここに私の問題があります。定義済みの一連の番号を持つJAVAループ

は、私が唯一の4可能な向きがある考えると、すべての時間で私のロボットの向きを知りたい:

上/下/左/右

は、私は次の番号でこれらの位置のそれぞれを定義します:

UpとDown = 0、左= 1、右= -1

は、だから私のロボットが現在必要があります(最大言う) "0" 志向、と私は値、右に90度回転していると言います1に変更します。右に90度回転すると再び0に戻ります。

したがって、次のシーケンスがあります。0、-1,0,1(任意の時点から開始できます)。

基本的に私のロボットはさまざまなタイプの障害に遭遇します。彼が1つを満たすたびに、彼は右または左に回るでしょう。私は彼がいつも "上"の方向を向けるようにしたい。ロボットが「0」の位置にあるときに回転すると、ロボットはYの位置に影響を与えないので問題にはなりません(X-Y軸を考慮する)。しかし、彼が1位か-1位にいる場合、彼は90°* 1または90°*(-1)を回す必要があります。

私は、ロボットが回転している右(または左)の「四分円」の数に応じて、現在の値を正しく変更する方法を見つけるのに苦労しています。私は(-1)の指数を考えましたが、どうやって分かりませんでした。

お手伝いできますか?

ありがとうございました!

P.S.条件があっても値を確認できるのは分かっていますが、クラスがたくさんあり、回転させる方法を何度も使うので、できるだけ短く簡単にする必要があります。

+0

なぜ別々の値をあきらめないのですか? – GurV

+1

@ Gurwinderと同様に、-1から1の範囲の代わりに "N、S、E、W"を使用することをお勧めします。 –

+0

全部の仕組みが基本であり、基本的にはこれらの値が他のメソッドの乗数として使用されるためです。 @Gurwinder – FredV

答えて

1

あなたの問題は、洞官または余弦関数を試すのに適しているようです。

あなたは象限として、あなたの問題を使用する場合は、あなたのよう洞の礼儀を使用することができます。その場合は

sin(0) = 0 
sin(90) = 1 
sin(180) = 0 
sin(270) = -1 

、0度と180度が0(N及びS)であり、E - Wそれぞれ1および-1である。

お手伝いできますか?

+0

ありがとう、私はそれを試してみよう! – FredV

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()

関連する問題