如何在二维矩阵中找到直接相连的邻居?
How to finding a directly connected neighbour in 2D matrix?
在二维矩阵中,我想通过 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 ║
║ ║
╚═══════╝
几年前,当我开始编程时,我遇到了同样的问题,并用一个丑陋的 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)的单个公式访问
我不想所有的邻居都有,比如在它周围定义space(x-1,y-1到x+1,y+1)。只需迭代 throw 正方形,这将是一种简单的方法。我只想要一个单元格。
这听起来很简单,但在寻找一个简短、快速且合法的解决方案时让我很头疼。首选语言是 C++
我对您的解决方案感到很兴奋!
编辑
我现在想通了。
看看这个:Graph
遗憾的是,我还不允许 post 图片,但正如您所见,图表与表示方向的常量的交集正是必须添加到 x 坐标的内容,如上所示
这意味着,我们可以使用简单的正弦波来获取 y,由此得出的公式为:
x1 = x + cos((2*pi*(dir-1))/4)
y1 = y + cos((2*pi*(dir-2))/4)
而 dir
是从 0 到 3
这就是我找到一种纯数学方法来计算相连邻居的解决方案。当然这可以通过某种方式得到批准?
感谢您的解决方案!期待看到您对此问题的解决方案!
干杯!
你考虑过使用数组吗?例如,
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
。
我想你可以用两个来解决"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)
}
}
}
在二维矩阵中,我想通过 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 ║
║ ║
╚═══════╝
几年前,当我开始编程时,我遇到了同样的问题,并用一个丑陋的 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)的单个公式访问
我不想所有的邻居都有,比如在它周围定义space(x-1,y-1到x+1,y+1)。只需迭代 throw 正方形,这将是一种简单的方法。我只想要一个单元格。
这听起来很简单,但在寻找一个简短、快速且合法的解决方案时让我很头疼。首选语言是 C++
我对您的解决方案感到很兴奋!
编辑
我现在想通了。
看看这个:Graph
遗憾的是,我还不允许 post 图片,但正如您所见,图表与表示方向的常量的交集正是必须添加到 x 坐标的内容,如上所示
这意味着,我们可以使用简单的正弦波来获取 y,由此得出的公式为:
x1 = x + cos((2*pi*(dir-1))/4)
y1 = y + cos((2*pi*(dir-2))/4)
而 dir
是从 0 到 3
这就是我找到一种纯数学方法来计算相连邻居的解决方案。当然这可以通过某种方式得到批准?
感谢您的解决方案!期待看到您对此问题的解决方案!
干杯!
你考虑过使用数组吗?例如,
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
。
我想你可以用两个来解决"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)
}
}
}