22

(披露,我主要是数学文盲)。

我有一个这种格式的数组:

var grid = [
  [0,0], [0,1], [0,2], [0,3],
  [1,0], [1,1], [1,2], [1,3],
  [2,0], [2,1], [2,2], [2,3],
  [3,0], [3,1], [3,2], [3,3]
];

我需要以 90 度为增量“旋转”它,所以它是这样的:

var grid = [
  [3,0], [2,0], [1,0], [0,0], 
  [3,1], [2,1], [1,1], [0,1], 
  [3,2], [2,2], [1,2], [0,2], 
  [3,3], [2,3], [1,3], [0,3] 
];

我如何在 Javascript 中实现这一点?

4

4 回答 4

35

旋转二维 mxn 矩阵

那些在此处寻找旋转二维矩阵(更一般的情况)的人是如何做到的。

示例:原始矩阵:

[
  [1,2,3],
  [4,5,6], 
  [7,8,9]
]

旋转 90 度:

[
    [7,4,1]
    [8,5,2]
    [9,6,3]
]

这是通过以下方式完成的:

matrix[0].map((val, index) => matrix.map(row => row[index]).reverse())
于 2019-11-02T04:55:55.813 回答
17

实际轮换方法的功劳归功于此答案。

我的方法很简单。只需确定行长是多少,然后遍历每个项目,将数组索引转换为 x/y 等效项,然后应用链接答案中使用的方法进行旋转。最后,我将旋转后的 X/Y 坐标转换回数组索引。

var grid = [
  [0,0], [0,1], [0,2], [0,3],
  [1,0], [1,1], [1,2], [1,3],
  [2,0], [2,1], [2,2], [2,3],
  [3,0], [3,1], [3,2], [3,3]
]; 

var newGrid = [];
var rowLength = Math.sqrt(grid.length);
newGrid.length = grid.length

for (var i = 0; i < grid.length; i++)
{
    //convert to x/y
    var x = i % rowLength;
    var y = Math.floor(i / rowLength);

    //find new x/y
    var newX = rowLength - y - 1;
    var newY = x;

    //convert back to index
    var newPosition = newY * rowLength + newX;
    newGrid[newPosition] = grid[i];
}

for (var i = 0; i < newGrid.length; i++)
{   
    console.log(newGrid[i])
}

输出:

[3, 0] [2, 0] [1, 0] [0, 0]  
[3, 1] [2, 1] [1, 1] [0, 1]  
[3, 2] [2, 2] [1, 2] [0, 2]  
[3, 3] [2, 3] [1, 3] [0, 3]  

为懒惰的人提琴。还有一个5x5 的网格小提琴来证明该算法适用于 N 个网格大小,只要它们是正方形的。

于 2013-03-02T05:25:36.643 回答
9

这是顺时针和逆时针 90 度旋转的两个功能:

    function rotateCounterClockwise(a){
        var n=a.length;
        for (var i=0; i<n/2; i++) {
            for (var j=i; j<n-i-1; j++) {
                var tmp=a[i][j];
                a[i][j]=a[j][n-i-1];
                a[j][n-i-1]=a[n-i-1][n-j-1];
                a[n-i-1][n-j-1]=a[n-j-1][i];
                a[n-j-1][i]=tmp;
            }
        }
        return a;
    }

    function rotateClockwise(a) {
        var n=a.length;
        for (var i=0; i<n/2; i++) {
            for (var j=i; j<n-i-1; j++) {
                var tmp=a[i][j];
                a[i][j]=a[n-j-1][i];
                a[n-j-1][i]=a[n-i-1][n-j-1];
                a[n-i-1][n-j-1]=a[j][n-i-1];
                a[j][n-i-1]=tmp;
            }
        }
        return a;
    }
于 2018-01-22T08:26:58.747 回答
2

我真的不需要处理索引,因为我可以将值从一个地方复制到另一个地方,这简化了答案:

var grid = [
  [0,0], [0,1], [0,2], [0,3], [0,4],
  [1,0], [1,1], [1,2], [1,3], [1,4],
  [2,0], [2,1], [2,2], [2,3], [2,4],
  [3,0], [3,1], [3,2], [3,3], [3,4],
  [4,0], [4,1], [4,2], [4,3], [4,4]
]; 

var side = Math.sqrt(grid.length);

var rotate = function(d,i){
   return [Math.abs(i % side - side+1), Math.floor(i/side)]
}
grid = grid.map(rotate);

你可以在这里看到一个 jsfiddle:http: //jsfiddle.net/KmtPg/

于 2013-03-02T08:31:27.857 回答