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

时间:2017-02-14 16:41:53

标签: javascript

我正在开发一款基于N×M方格板的2D游戏(实际上是N×N,因为它是正方形)。董事会中的每个方格都有一个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]中的一个对应于左上角,右上角,左下角,底部-right),返回每个象限中元素的ID。例如,getQuadrant(10, 0)将返回左上象限中的ID:

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

我尝试过几个序列求解器来找到一个等式,但是他们无法找到匹配。我提出的唯一可行的解​​决方案是象限依赖,这意味着我基本上有4个功能。

2 个答案:

答案 0 :(得分:2)

您可以使用for循环创建此类函数,其中i按网格长度递增。然后你只需要根据象限参数切割网格的前半部分或后半部分。



var data = Array.from(Array(100), (e, i) => e = i)

function getQuadrant(data, n, quad) {
  var result = []
  for (var i = 0; i < data.length; i += n) {
    var p = i + (n / 2)

    if (quad == 0 && i < data.length / 2) result.push(...data.slice(i, p))
    if (quad == 1 && i < data.length / 2) result.push(...data.slice(p, i + n))
    if (quad == 2 && i >= data.length / 2) result.push(...data.slice(i, p))
    if (quad == 3 && i >= data.length / 2) result.push(...data.slice(p, i + n))
  }
  return result
}

console.log(JSON.stringify(getQuadrant(data, 10, 0)))
console.log(JSON.stringify(getQuadrant(data, 10, 1)))
console.log(JSON.stringify(getQuadrant(data, 10, 3)))
&#13;
&#13;
&#13;

答案 1 :(得分:2)

<强>要点:

以下表达式求值为象限nn x quad平方的id数组:

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

<强>详细信息:

下面的功能包括一个公式,允许您为任意大小的矩形网格(N&amp; 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);或仅用{{1}替换上述代码中的每个m如下面的4 x 4方格网代码所示:

n

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

矩形N x M网格的说明:

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

这创建了一个整数序列(即从零开始),其长度是一个象限的长度,即原始网格的四分之一的长度。这些序号以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