假设我有以下网格,网格的每个单元格都有一个映射到 1d 数组的索引。
0, 1, 2
3, 4, 5,
6, 7, 8
我可以用一个 1d 数组来表示这一点,例如:[0, 1, 2, 3, 4, 5, 6, 7, 8]
我想知道一种将 2d 坐标(如(3,1)
)映射到数组中索引的简单方法,在这种情况下,将是2
.
经过大量研究,我发现很多人提出了这个等式:index = x + (y * width)
,但它似乎在我的测试中不起作用。
例如,对于(1, 1)
,结果将是index = 1 + (1 * 3) = 4
,而对于(3, 1)
将是index = 3 + (1 * 3) = 6
,这对我来说没有任何意义。
是否有可能以简单的方式实现这一目标?或者我需要像 for 这样的迭代器?
二维矩阵表示法通常(row, col)
,索引从0开始。
因此,(3, 1)
无效:只有 3 行,从 0 到 2。(1, 1)
表示第 2 行,第 2 列,在您的示例中4
。公式如下:
(row * width) + col
(2, 1) = 2*3+1 = index 7
再次使用 0 作为第一行/列。
如果您真的想继续思考从 1 开始的索引,只需将公式更改为:
((row - 1) * width) + (col - 1) = 1D index
在您的情况下,它会index = (x - 1) + ((y - 1) * width)
,因为您的坐标系从 1 开始,数组从 0 开始。
let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8];
function getPosition(x, y, width) {
return x - 1 + (y - 1) * width;
}
console.log({
position: getPosition(3, 1, 3),
element: arr[getPosition(3, 1, 3)]
});
它确实是index = x + y * width
的(括号是不必要的)或index = y + x * width
,这取决于你是希望平面数组像你的问题一样将行保持在一起([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
,index = x + y * width
),还是保持列在一起([0, 3, 6, 1, 4, 7, 2, 5, 8]
,index = y + x * width
)。但索引通常从 0 开始,而不是 1。所以你的(1,1)将是(0,0),你的(3,1)将是(2,0)。
这是第一个:
// 0, 1, 2
// 3, 4, 5
// 6, 7, 8
const a = [0, 1, 2, 3, 4, 5, 6, 7, 8];
let x = 0, y = 1;
let index = x + y * 3;
console.log(`(${x}, ${y}) is index ${index}, value ${a[index]}`);
x = 2;
y = 0;
index = x + y * 3;
console.log(`(${x}, ${y}) is index ${index}, value ${a[index]}`);
这是第二个:
// 0, 1, 2
// 3, 4, 5
// 6, 7, 8
const a = [0, 3, 6, 1, 4, 7, 2, 5, 8];
let x = 0, y = 1;
let index = y + x * 3;
console.log(`(${x}, ${y}) is index ${index}, value ${a[index]}`);
x = 2;
y = 0;
index = y + x * 3;
console.log(`(${x}, ${y}) is index ${index}, value ${a[index]}`);