2017-02-13 73 views
-2

在一個2D矩陣中,我想通過它的ID分別方向找到一個直接連接的鄰居。如何在2D矩陣中找到直接相連的鄰居?

我的意思:
X0 = X
Y0 = Y1
X1 = X + 1
Y1 = Y
X2 = X
Y2 = Y + 1
X3 = X - 1個
Y3 = Y

或作爲圖形:

 ╔═══════╗ 
     ║ N ║ 
     ║ x,y-1 ║ 
     ║  ║ 
╔═══════╬═══════╬═══════╗ 
║ W ║  ║ E ║ 
║ x-1,y ║ x,y ║ x+1,y ║ 
║  ║  ║  ║ 
╚═══════╬═══════╬═══════╝ 
     ║ S ║ 
     ║ x,y+1 ║ 
     ║  ║ 
     ╚═══════╝ 

幾年前,當我開始編程我有同樣的問題,並與可以大大提高一個醜陋的switch-case解決它:

if (mode == 'Y'){ 

    switch(direction){ 
     case 1: 
      return -1; 
     case 2: 
      return 0; 
     case 3: 
      return 1; 
     case 4: 
      return 0; 
     default: 
      break; 
    } 
} 

if (mode == 'X'){ 

    switch(direction){ 
     case 1: 
      return 0; 
     case 2: 
      return 1; 
     case 3: 
      return 0; 
     case 4: 
      return -1; 
     default: 
      break; 
    } 
} 

小區應該是用X,Y單式訪問和方向(N,E,S,W例如0-3)

我不想擁有所有的鄰居,比如定義它周圍的空間(x-1,y-1到x + 1,y + 1)。這隻會反覆拋出廣場而變得簡單。我只想要一個單元格。

這聽起來很簡單,但讓我頭痛尋找一個簡短,快速和合法的解決方案。首選語言是C++

我很高興您的解決方案!

編輯

我現在想通了這個問題。

在此請看:Graph

可悲的是IM尚未允許張貼圖片,但你可以看到與代表方向的常數圖的交叉點正是要被添加到x座標爲你可以在上面看到

這意味着,我們可以用一個簡單的正弦波用於獲取y和從這個公式是:

x1 = x + cos((2*pi*(dir-1))/4) 
y1 = y + cos((2*pi*(dir-2))/4) 

雖然dir是從0到3

這就是我找到一個純粹的數學計算方法連接的鄰居的解決方案。當然,這可以用某種方式來解釋?

感謝您的解決方案!期待看到您解決這個問題的方案!

乾杯!

+0

歡迎SO!請解釋你在目前的解決方案中存在的問題以及你認爲什麼是「合適的」解決方案。 –

+0

偏題:「一個細胞應該可以通過一個單一的公式與x,y和方向(N,E,S,W,例如0-3)」推薦使用enum來代替數字0..3很好,易於閱讀的名字。 – user4581301

回答

0

你有沒有考慮過使用數組?例如,

int goY[] = {-1,0,1,0};  
int goX[] = {0,1,0,-1}; 

x += goX[direction]; 
y += goY[direction]; 

或合併mode

int move[2][4] = 
{ 
    {-1,0,1,0},  
    {0,1,0,-1} 
}; 

你的代碼可能是這樣的:

loc += move[mode - 'x'][direction]; 

但我懷疑你可以用mode完全廢除。

0

我認爲你可以有兩個解決它 「for循環」

例如:

for (cx = -1; cx <= 1; cx++) { 
    for (cy = -1; cy <= 1; cy++) { 
     // All neighbors (N, NE, E, SE, S, SW, W, NW) 
     if (1 == abs(cx - cy)) { 
      // directneighbors (N, E, S, W) 
     } 
    } 
}