Вращение массива 2D-пикселей на 90 градусов

У меня есть массив пиксельных данных для изображения. Изображение, которое я получаю, уже повернуто на 270 градусов. Поэтому я пытаюсь снова повернуть его на 90 градусов, чтобы получить правильное изображение. Я попробовал алгоритм транспонирования, изменив data[x][y] на data[y][x], но я не думаю, что это правильный путь. Может ли кто-нибудь вести меня, что я могу сделать, чтобы он повернулся?

Ответ 1

Это можно сделать, не используя лишнее пространство, так называемое Транзирование внутри места (не то же самое). Не забудьте сделать некоторое зеркалирование после транспонирования.

  • Если изображение квадратное

    enter image description here

  • Если изображение не квадратное

    • Для неквадратных матриц алгоритмы сложнее. Многие из алгоритмов до 1980 года можно описать как алгоритмы "после цикла". То есть, они перебирают циклы, перемещая данные из одного места в другое в цикле. В псевдокодной форме:

    enter image description here

Ответ 2

У вас есть old_data[rows][cols] и new_data[cols][rows], а затем:

for(int i=0; i<cols; i++) {
    for(int j=0; j<rows; j++) {
        new_data[i][j] = old_data[rows-1-j][i];
    }
}

Это должно вращать old_data на 90 градусов CW.

Ответ 3

Если вы хотите сделать это на месте с пространством O (1), вы можете выполнить следующее:

  • Переставить матрицу путем замены data[i][j] и data[j][i]:

    for (int i = 0; i < n; i += 1){
        for (int j = i+1; j < n; j += 1){
            swap(data[i][j], data[j][i]);
        }
    }
    
  • Обратить каждую строку или столбец за +90 или -90 градусов вращения соответственно. Например, для +90 градусов вращения:

    for (int i = 0; i < n; i += 1){
        for (int j = 0; j < n/2; j += 1){
            swap(data[i][j], data[i][n-1-j]);
        }
    }