У меня есть массив пиксельных данных для изображения. Изображение, которое я получаю, уже повернуто на 270 градусов. Поэтому я пытаюсь снова повернуть его на 90 градусов, чтобы получить правильное изображение. Я попробовал алгоритм транспонирования, изменив data[x][y]
на data[y][x]
, но я не думаю, что это правильный путь. Может ли кто-нибудь вести меня, что я могу сделать, чтобы он повернулся?
Вращение массива 2D-пикселей на 90 градусов
Ответ 1
Это можно сделать, не используя лишнее пространство, так называемое Транзирование внутри места (не то же самое). Не забудьте сделать некоторое зеркалирование после транспонирования.
-
Если изображение квадратное
-
Если изображение не квадратное
- Для неквадратных матриц алгоритмы сложнее. Многие из алгоритмов до 1980 года можно описать как алгоритмы "после цикла". То есть, они перебирают циклы, перемещая данные из одного места в другое в цикле. В псевдокодной форме:
Ответ 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]); } }