Ho una matrice di dati di pixel per un'immagine. L'immagine che sto ottenendo è già ruotata a 270 gradi. Quindi sto provando a ruotarlo di nuovo di 90 gradi per avere l'immagine corretta. Ho provato un algoritmo di trasposizione, modificando data[x][y]
a data[y][x]
, ma non penso che sia il modo corretto. Qualcuno può guidarmi cosa posso fare per farlo ruotare?Rotazione di un array di pixel 2D di 90 gradi
5
A
risposta
7
Questo può essere fatto senza utilizzare alcuno spazio aggiuntivo, così chiamato In-place matrix transposition (non esattamente lo stesso). Ricordati di fare un po 'di mirroring dopo la trasposizione.
Se l'immagine è quadrata
Se l'immagine non è quadrata
- Per matrici non quadrati, gli algoritmi sono più complicate. Molti degli algoritmi precedenti al 1980 potrebbero essere descritti come algoritmi "follow-the-cycle". Cioè, passano sopra i cicli, spostando i dati da una posizione a quella successiva nel ciclo. In forma di pseudocodice:
14
Hai old_data[rows][cols]
e new_data[cols][rows]
, quindi:
for(int i=0; i<cols; i++) {
for(int j=0; j<rows; j++) {
new_data[i][j] = old_data[rows-1-j][i];
}
}
Questo dovrebbe ruotare di 90 gradi old_data CW.
5
Se si vuole fare sul posto con O (1) spazio, è possibile seguire questa:
trasporre la matrice scambiando
data[i][j]
edata[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]); } }
Invertire ogni riga o colonna per +90 o -90 gradi di rotazione, rispettivamente. Ad esempio, per +90 gradi di rotazione:
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]); } }
Questo è l'unico modo. È possibile parallelizzare il processo per renderlo più veloce. –