如何在2D矩阵中找到直接连接的邻居?

时间:2017-02-13 21:38:18

标签: c++ math matrix 2d formula

在2D矩阵中,我希望通过其ID和方向找到单个直接连接的邻居。

我的意思是:
x0 = x
y0 = y - 1
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 ║
        ║       ║
        ╚═══════╝

几年前,当我开始编程时,我遇到了同样的问题并用一个丑陋的开关盒解决了这个问题,这个案例可以大大改进:

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

遗憾的是,我还不允许发布图片,但正如您所见,您可以看到图表与表示方向的常数的交点正是必须添加到x坐标的内容,如上所示

这意味着,我们可以使用简单的正弦波来获得y,并且公式为:

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

dir从0到3

这是我的解决方案,找到一种纯粹的数学计算方法来计算连接的邻居。当然这可以在某种程度上得到批准吗?

感谢您的解决方案!期待看到您解决此问题的方法!

干杯!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为你可以用两个" for-loops"

解决它

例如:

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