Программа вращает только квадратные изображения правильно

Я пытался работать с файлами PGM на C++, получать их негативы и т. Д. Теперь, когда я начал вращаться, у меня был грубый псевдокод о том, как мы будем вращать матрицу, вот результат на числовой матрице:

Тест с вращающейся матрицей

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

Повернутое квадратное изображение

Но на прямоугольных изображениях это дает такой результат:

Повернутое изображение прямоугольника

Вот код:

   void loadRotMatrix()
                    {
                        //transpose of matrix
                        for(int i=0;i<cols;i++)
                        {
                            for(int j=0;j<rows;j++)
                            {
                                rotatedmatrix[i][j] = matrix[j][i];
                            }
                        }
                        //flipped transposed
                        for(int i=0;i<rows;i++)
                        {
                            int temp =0;
                            for(int j=0,k=cols-1;j<k;j++,k--)
                            {
                            temp=rotatedmatrix[j][i];
                            rotatedmatrix[j][i]=rotatedmatrix[k][i];
                            rotatedmatrix[k][i]=temp;
                            }
                        }
                    }

Теперь я не могу на всю жизнь расшифровать, что здесь происходит и что превращает мою собаку в цербера:p

2 ответа

Вы не можете перевернуть или транспонировать неквадратную матрицу. Прежде чем приступить к математике, добавьте дополнительные строки или столбцы, чтобы сделать квадрат матрицы, выполните математику, а затем удалите добавленные столбцы или строки, чтобы получить исходное изображение без отступов.

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

Вам нужно будет повернуть массив в другой массив, чтобы индексы имели смысл.

int sourceMatrix[100][200];

int destMatrix[200][100];
Другие вопросы по тегам