Существует ли элегантный алгоритм для поворота 4×4 матрицы на 90 градусов?

var a = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

Мне нужно привести из такого вида
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
в такой вид
0 4 8 12
1 5 9 13
2 6 10 14
3 7 11 15


Я могу с помощью двух циклов и условий, но есть может способ примитивнее?
  • Вопрос задан
  • 1979 просмотров
Решения вопроса 1
@Aves
var a = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
var b = [];

for (var y=0; y<4; y++) {
    for (var x=0; x<4; x++) {
        b[x*4+y] = a[y*4+x];
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
maaGames
@maaGames
Погроммирую программы
В некоторых случаях имеет смысл вообще не поворачивать матрицу, а сохранить флаг о том, что она повёрнута и в алгоритмах менять местами x-y.
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
1. Можно просто записать 6 пар перестановок:

function swap(arr, a, b){
    var tmp = arr[a];
    arr[a] = arr[b];
    arr[b] = tmp;
}
var a = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
swap(a,1,4);
swap(a,2,8);
swap(a,3,12);
swap(a,6,9);
swap(a,7,13);
swap(a,11,14);


2. Можно шагать с инкрементом 4 и брать остаток от деления на 15:

var a = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] ,tmp;

function pivot(a) {
    var i, result = [];
    for( i=0; i<60; i+=4) result.push(a[i%15]);
    result.push(a[15]);
    return result;
}

var b = pivot(a);
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
... но есть может способ примитивнее?

Да, есть быстрее, но он совсем не примитивнее..
То, что видно сразу:
1. сохраняется главная диагональ -> вычисляем с копированием главных диагональных элементов
2. позиции элементов по X и Y меняются местами - > значит можно проводить вычисление только НАД (ну, или ПОД) главной диагональю!
Итог: прирост >50%
......вроде все)))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы