在一个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
这就是我找到一个纯粹的数学计算方法连接的邻居的解决方案。当然,这可以用某种方式来解释?
感谢您的解决方案!期待看到您解决这个问题的方案!
干杯!
欢迎SO!请解释你在目前的解决方案中存在的问题以及你认为什么是“合适的”解决方案。 –
偏题:“一个细胞应该可以通过一个单一的公式与x,y和方向(N,E,S,W,例如0-3)”推荐使用enum来代替数字0..3很好,易于阅读的名字。 – user4581301