gpt4 book ai didi

javascript - 返回 N x M 网格象限中点 ID 的函数

转载 作者:行者123 更新时间:2023-11-29 17:52:27 25 4
gpt4 key购买 nike

我正在开发一个基于 N x M 正方形棋盘的 2D 游戏(实际上是 N x N,因为它是正方形)。棋盘上的每个方 block 都分配了一个 ID,从 ID 0 开始,从左到右、从上到下计数。

例如,对于 10 x 10 的棋盘

| 0  1  2  3  4  5  6  7  8  9  |
| 10 11 12 13 14 15 16 17 18 19 |
| 20 21 22 23 24 25 26 27 28 29 |
| etc |
| etc |
| etc |
| etc |
| etc |

我想要一个函数,它采用网格的大小 (N) 和一个象限([0, 1, 2, 3] 对应的一个)到左上角、右上角、左下角、右下角),它返回每个象限中元素的 ID。例如,getQuadrant(10, 0) 将返回左上象限中的 ID:

[0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24... 44]

我已经尝试了几个序列求解器来找到一个方程,但它们无法找到匹配项。我想出的唯一可行的解​​决方案是象限相关的,这意味着我基本上有 4 个功能。

最佳答案

总结:

以下表达式的计算结果为象限 quad 中的 nxn 正方形的 id 数组:

Array.from({length: n * n / 4}).map((_,i) =>
2 * i - i % (n / 2) + (quad % 2) * n / 2 + (quad > 1) * n * n / 2
)

详细信息:

下面的函数包含一个公式,允许您为任意大小的矩形网格输入 N 和 M(N 和 M 必须为偶数),以及象限编号(0 到 3)。使用的第一个示例是 6 x 4 网格。

 0  1  2  3  4  5
6 7 8 9 10 11
12 13 14 15 16 17
18 19 20 21 22 23

const getRectQuadrant = (n, m, quad) =>
Array.from({length: n/2 * m/2}).map((_,i) =>
2 * i - i % (n / 2) + (quad % 2) * n / 2 + (quad > 1) * n * m / 2
);

console.log(JSON.stringify(getRectQuadrant(6, 4, 0)));
console.log(JSON.stringify(getRectQuadrant(6, 4, 1)));
console.log(JSON.stringify(getRectQuadrant(6, 4, 2)));
console.log(JSON.stringify(getRectQuadrant(6, 4, 3)));

要将其概括为正方形网格(即 M = N),只需创建另一个调用该函数的函数,即 const getSquareQuadrant = (n, quad) => getRectQuadrant(n, n, quad); 或仅将上述代码中的每个 m 替换为 n,如以下 4 x 4 方形网格代码所示:

 0  1  2  3
4 5 6 7
8 9 10 11
12 13 14 15

const getSquareQuadrant = (n, quad) =>
Array.from({length: n * n / 4}).map((_,i) =>
2 * i - i % (n / 2) + (quad % 2) * n / 2 + (quad > 1) * n * n / 2
);

console.log(JSON.stringify(getSquareQuadrant(4, 0)));
console.log(JSON.stringify(getSquareQuadrant(4, 1)));
console.log(JSON.stringify(getSquareQuadrant(4, 2)));
console.log(JSON.stringify(getSquareQuadrant(4, 3)));

矩形 N x M 网格的解释:

Array.from({length: n/2 * m/2}).map((_,i) => ...

这将创建一个整数序列(即从零开始),其长度为一个象限的长度,即原始网格四分之一的长度。这些序号作为 i 向前传递。

2 * i - i % (n / 2) + (quad % 2) * n / 2 + (quad > 1) * n * m / 2
------------------- ------------------ ----------------------
creates the values adds a constant if adds a constant if you
in the top left you want the right want the bottom half
quadrant half

矩形网格的更详细/可读版本:

const getRectQuadrant = (m, n, quad) => {
const quadrantPlaceholders = Array.from({length: n/2 * m/2});
const offsetForRightHalf = (quad % 2) * n / 2;
const offsetForBottomHalf = (quad > 1) * n * m / 2;
const idsForQuadrant = quadrantPlaceholders.map((_,i) => {
const idForTopLeft = 2 * i - i % (n / 2);
return idForTopLeft + offsetForRightHalf + offsetForBottomHalf;
});
return idsForQuadrant;
};

console.log(JSON.stringify(getRectQuadrant(4, 6, 0)));
console.log(JSON.stringify(getRectQuadrant(4, 6, 1)));
console.log(JSON.stringify(getRectQuadrant(4, 6, 2)));
console.log(JSON.stringify(getRectQuadrant(4, 6, 3)));

关于javascript - 返回 N x M 网格象限中点 ID 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42231564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com