2016-12-03 2 views
-1

У меня есть матрица, которая хранит пиксели, как это:матрица Поворот, которая хранит пиксели

(0, 0, 255) (0, 255, 0) (255, 0, 0) 
(0, 128, 0) (0, 255, 0) (0, 128, 0) 

с числом линий 2 и столбцы 3 [но на самом деле 9 из пикселей R, G, B значений] и я вынуждены их вращать, поэтому я получаю:

(0, 128, 0) (0, 0, 255) 
(0, 255, 0) (0, 255, 0) 
(0, 128, 0) (255, 0, 0) 

с 3 линиями и 2 колоннами. У меня также есть ограничение: не разрешено использовать структуры, только для циклов. Пробовал различные комбинации, но ни один из них, как правило, не является правильным. Любая помощь будет высоко ценится.

+0

Прочитайте это, чтобы получить представление о том: http://stackoverflow.com/questions/16737298/what-is-the -fastest-way-to-transpose-a-matrix-in-c – MYGz

+0

Это не помогает. – adikinzor

ответ

1

Вам необходимо учитывать, что ваша матрица построена из блоков. Он содержит BLOCK_MATRIX_M x BLOCK_MATRIX_N блоков. Каждый блок содержит BLOCK_M x BLOCK_N элементов.

Вы должны вращать матрицу блоков, но оставить Сами блоки без изменений:

#define BLOCK_MATRIX_M   2 
#define BLOCK_MATRIX_N   3 
#define BLOCK_M     1 
#define BLOCK_N     3 

#define MATRIX_M    (BLOCK_MATRIX_M * BLOCK_M) 
#define MATRIX_N    (BLOCK_MATRIX_N * BLOCK_N) 
#define ROTATED_MATRIX_M  (BLOCK_MATRIX_N * BLOCK_M) 
#define ROTATED_MATRIX_N  (BLOCK_MATRIX_M * BLOCK_N) 

int matrix[MATRIX_M][MATRIX_N] = { 
    { 0, 0, 255, 0, 255, 0, 255, 0, 0 }, 
    { 0, 128, 0, 0, 255, 0, 0, 128, 0 } 
}; 

int rotated_matrix[ROTATED_MATRIX_M][ROTATED_MATRIX_N]; 

// iterate over the blocks 
for (int i = 0; i < BLOCK_MATRIX_M; i++) { 
    for (int j = 0; j < BLOCK_MATRIX_N; j++) { 
     int rotated_i = j; 
     int rotated_j = BLOCK_MATRIX_M - i - 1; 

     // iterate over the elements of a block 
     for (int k = 0; k < BLOCK_M; k++) { 
      for (int l = 0; l < BLOCK_N; l++) { 
       int x = i * BLOCK_M + k; 
       int y = j * BLOCK_N + l; 
       int rotated_x = rotated_i * BLOCK_M + k; 
       int rotated_y = rotated_j * BLOCK_N + l; 

       rotated_matrix[rotated_x][rotated_y] = matrix[x][y]; 
      } 
     } 
    } 
} 
Смежные вопросы