2017-02-13 111 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) 
     } 
    } 
}