6

私のタイルベースのゲームでは、指定されたポイント オフセット (2 つのポイント間の差) に基づいて方向を計算する必要があります。たとえば、ポイント (10, 4) に立っているとします。ポイント (8, 6) に移動したいとします。進行方向は北西です。これを計算する最良の方法は何でしょうか?

これがJavaでの基本的な実装です。

public int direction(int x, int y) {
    if (x > 0) {
        if (y > 0) {
            return 0; // NE
        } else if (y < 0) {
            return 1; // SE
        } else {
            return 2; // E
        }
    } else if (x < 0) {
        if (y > 0) {
            return 3; // NW
        } else if (y < 0) {
            return 4; // SW
        } else {
            return 5; // W
        }
    } else {
        if (y > 0) {
            return 6; // N
        } else if (y < 0) {
            return 7; // S
        } else {
            return -1;
        }
    }
}

確かに最適化または短縮できます。何か助けはありますか?ありがとう。

4

5 に答える 5

4

最も理解しやすい方法は、すべてのケースの値を含む静的配列を作成することだと思います。

// Won't say anything about how much these values make sense
static final int[][] directions = {
    {3,  6, 0},
    {5, -1, 2}, // -1 for "no direction", feel free to replace
    {4,  7, 1}
};

public int direction(int x, int y) {
    x = (x < 0) ? 0 : ((x > 0) ? 2 : 1);
    y = (y < 0) ? 0 : ((y > 0) ? 2 : 1);

    return directions[y][x];
}

編集: これで正しいです(なぜ多くの言語に適切なsgn機能が欠けているのですか?)

于 2010-08-29T12:41:16.883 に答える
1

if条件での私の答え:)。

   public int direction(int x, int y) {
        //0 NE, 1 SE, 2 E, 3 NW, 4 SW, 5 W, 6 N, 7 S, 8 (Same place / Not a direction)  
        int direction = 0;

        if(x < 0){
            direction = 3;
        }else if(x == 0){
            direction = 6;
        }

        if(y < 0){
            direction = direction + 1;
        }else if(y == 0){
            direction = direction + 2;
        }
            return direction;
    }
于 2010-08-29T13:02:27.530 に答える
0
  • すべての状態を保持する 2D 配列を定義します。

  • x と y をその値に基づいて 0、1、または 2 に変換します (x>0 または x<0 または x ==0)

  • 配列の特定のインデックスを返します。

于 2010-08-29T12:41:32.000 に答える
0

このように 8 つの基本方位を個別の列挙値として表すと、これは可能な限り短く簡潔になります。8 つの個別の戻り値から選択しているので、8 つの葉を持つ決定木が最適です。

方向を 2 つのコンポーネント (NS と EW) に分割すると、少しすっきりするかもしれませんが、方向で何をするかについて詳しく知らなければそれが面倒なことに値するかどうかはわかりません。

于 2010-08-29T12:47:12.467 に答える
0

方向を Point または同様のもの ((x,y) タプル) として受け取って返すことができます。したがって、p0 = (10, 4) に立っていて、p1 = (8, 6) に移動したい場合、結果は (疑似コードで) 次のようになります。

norm(p1 - p0) = norm((-2,2)) = (-1,1)

絶対値で割ると、整数のノルムを計算できます。したがって、点については、両方のメンバーのノルムを計算します。(-1,1) は 3 よりも表現力があり、より簡単に操作できることに注意してください。

特定の操作が必要な場合は、独自の Java Point クラスを作成するか、ライブラリ内の既存のものを拡張できます。

于 2010-08-29T12:47:38.643 に答える