2017-03-03 15 views
5

Bạn có thể tìm thấy rất nhiều câu trả lời cho "xoay vuông hai mảng chiều", nhưng không phải "xoay không vuông hai mảng chiều", và mặc dù một số câu trả lời làm công việc như thế này:Làm thế nào để xoay mảng hai chiều không vuông hai lần để có tất cả các phép quay có thể?

rotate(tab) {                
     return tab[0].map(function(col, i) {         
      return tab.map(function(lig) {         
       return lig[i];            
      })                
     });                 
    } 

Họ chỉ làm việc lần đầu tiên bạn xoay. Nếu bạn xoay một lần nữa, bạn quay trở lại mảng đầu tiên, mà không phải là những gì tôi muốn, tôi muốn tất cả 3 kết hợp có thể có của một mảng xoay 90 '.

Trả lời

1

Bạn có thể sử dụng độ dài của mảng để tính toán các vị trí mới.

original left right 
-------- -------- -------- 
1 2 3 4 1  3 6 
4 5 6 5 2  2 5 
      6 3  1 4 

function rotateRight(array) { 
 
    var result = []; 
 
    array.forEach(function (a, i, aa) { 
 
     a.forEach(function (b, j, bb) { 
 
      result[bb.length - j - 1] = result[bb.length - j - 1] || []; 
 
      result[bb.length - j - 1][i] = b; 
 
     }); 
 
    }); 
 
    return result; 
 
} 
 

 
function rotateLeft(array) { 
 
    var result = []; 
 
    array.forEach(function (a, i, aa) { 
 
     a.forEach(function (b, j, bb) { 
 
      result[j] = result[j] || []; 
 
      result[j][aa.length - i - 1] = b; 
 
     }); 
 
    }); 
 
    return result; 
 
} 
 

 
var array = [[1, 2, 3], [4, 5, 6]]; 
 

 
console.log(rotateLeft(array)); 
 
console.log(rotateRight(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Chỉ cần một câu hỏi nhanh: mã của bạn hoạt động hoàn hảo ... tại sao không gọi rotateLeft() hai lần? –

+0

@OlivierPons, bạn có thể làm điều đó, cho đúng, bạn neet để gọi trái ba lần, nhưng tôi muốn có cả hai hướng để lựa chọn. –

0

Bạn có thể sử dụng một thư viện nhỏ tôi đã viết để hỗ trợ hoạt động lưới 2d (https://github.com/klattiation/gridl). Nó cũng hỗ trợ xoay vòng.

const arr = [ 
    [1, 2, 3], 
    [4, 5, 6], 
]; 
const rotatedArray = gridl(arr).rotate(1).data(); 

// rotatedArray would look like this: 
// [ 
//  [4, 1], 
//  [5, 2], 
//  [6, 3], 
// ] 

Bạn cũng có thể xoay theo các hướng khác yên tĩnh một cách dễ dàng:

gridl(data).rotate(1); // rotates 90 degrees 
gridl(data).rotate(2); // rotates 180 degrees 
gridl(data).rotate(3); // rotates 270 degrees 
gridl(data).rotate(-1); // rotates -90 degrees 
gridl(data).rotate(-2); // rotates -180 degrees 
gridl(data).rotate(-3); // rotates -270 degrees 
Các vấn đề liên quan