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

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 に答える
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 に答える