met*_*ion 14 javascript math matrix
(披露,我主要是数学文盲).
我有这种格式的数组:
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]
];
Run Code Online (Sandbox Code Playgroud)
我需要以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]
];
Run Code Online (Sandbox Code Playgroud)
如何在Javascript中完成此操作?
Nit*_*hav 26
那些在这里寻找旋转二维矩阵(更一般的情况)的人是如何做到的。
示例:原始矩阵:
[
[1,2,3],
[4,5,6],
[7,8,9]
]
Run Code Online (Sandbox Code Playgroud)
旋转 90 度:
[
[7,4,1]
[8,5,2]
[9,6,3]
]
Run Code Online (Sandbox Code Playgroud)
这是通过以下方式完成的:
matrix[0].map((val, index) => matrix.map(row => row[index]).reverse())
Run Code Online (Sandbox Code Playgroud)
lmo*_*son 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])
}
Run Code Online (Sandbox Code Playgroud)
输出:
[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]
Run Code Online (Sandbox Code Playgroud)
懒惰的小提琴.并且一个5x5网格小提琴演示该算法适用于N个网格大小,只要它们是方形的.
这是两个顺时针和逆时针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;
}
Run Code Online (Sandbox Code Playgroud)