2010-08-29 133 views
6

對於我的基於圖塊的遊戲,我需要根據給定的點偏移量(兩點之間的差值)計算方向。例如,假設我站在點(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; 
     } 
    } 
} 

當然,它可以被優化或縮短。任何幫助?謝謝。

+0

這是否甚至編譯?當x和y都爲0時,它不會返回一個值。 – 2010-08-29 12:37:49

+0

它看起來很好,因爲它(模仿Matti找到的'else')。您可以將「return」語句分解出來,但這通常是在字節碼級別上可能不是一個的優化,而編譯器應該能夠爲您做的一個優化。你可以計算條件'y <0' and 'y> 0'的計算結果,但再次,一個體面的編譯器應該能夠爲你做到這一點。您可以更改某個方向的表示方式(例如,一對N/S軸和W/E軸分別爲-1,0或1的數字)使此方法更簡單,但似乎沒有必要。 – 2010-08-29 12:40:26

+0

@Matti Virkkunen啊你是對的(改變)。失敗的複製粘貼... – someguy 2010-08-29 12:44:30

回答

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功能?)

+0

幾乎正確。但x或y可以大於1或小於-1 – mhshams 2010-08-29 12:43:40

+0

@mohammad shamsi對於'Math.sgn'返回的值是-1,0或1以外的值是什麼? – 2010-08-29 12:47:28

+0

@帕斯卡爾:我最初忘了使用'sgn',這可能是什麼促使了他的評論。然後我發現Java似乎沒有'sgn'整數。咩。 – 2010-08-29 12:48:24

0
  • 定義二維數組來保存所有狀態。基於它們的值(X> 0或x < 0或x == 0)

  • 返回的數組的特定索引

  • 轉換x和y爲0,1或2。

0

這就像你可以得到的那樣簡短和乾淨,如果你用這種方式表示八個基本方向,就是單獨的枚舉值。你在8個不同的返回值之間選擇,所以具有8片葉子的決策樹是你能做的最好的。

如果您將方向分爲兩個組件(N-S和E-W),但您不知道更多關於您的方向的內容,我們無法知道這是否值得您付出麻煩。

0

你可以接收和返回你的方向作爲點或類似的東西(無論如何,一個(x,y)元組)。所以,如果你在P0 =站立(10,4),並希望移動到P1 =(8,6),其結果將是(僞代碼):

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

可以計算的常態整數,如果你除以它的絕對值。所以對於一個點你計算兩個成員的規範。請記住(-1,1)比3更有表現力,並且可以以更簡單的方式進行操作。

如果您需要特定的操作,您可以創建自己的Java Point類或擴展庫中的現有類。

1

我的答案如果條件:)。

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; 
    }