Girar una imagen 90 grados

Dada una imagen, ¿cómo la girarías 90 grados? Una pregunta vaga. Minimice el navegador y pruebe su solución antes de continuar. Una imagen se puede tratar como una array 2D que se puede almacenar en un búfer. Nos proporcionan las dimensiones de la array y su dirección base. ¿Cómo podemos convertirlo? Por ejemplo, vea la imagen de abajo,

* * * ^ * * *
* * * | * * *
* * * | * * *
* * * | * * *

Después de girar a la derecha, aparece (observar la dirección de la flecha)

* * * *
* * * *
* * * *
— — — >
* * * *
* * * *
* * * *

La idea es sencilla. Transforme cada fila de la array de origen en la columna requerida de la imagen final. Usaremos un buffer auxiliar para transformar la imagen. De la imagen de arriba, podemos observar que

first row of source ------> last column of destination
second row of source ------> last but-one column of destination
so ... on
last row of source ------> first column of destination

En forma pictórica, podemos representar las transformaciones anteriores de una array (mxn) en una array (nxm),

 

Si no lo ha intentado, al menos intente con su pseudocódigo ahora. Será fácil escribir nuestro pseudocódigo. En C/C++ normalmente recorreremos la array en el orden principal de las filas. Cada fila se transforma en una columna diferente de la imagen final. Necesitamos construir columnas de imagen final. Ver el siguiente algoritmo (transformación)

for (r = 0; r < m; r++)
{
   for (c = 0; c < n; c++)
   {
      // Hint: Map each source element indices into
      // indices of destination matrix element.
       dest_buffer [ c ] [ m - r - 1 ] = source_buffer [ r ] [ c ];
   }
}

Tenga en cuenta que hay varias formas de implementar el algoritmo en función del recorrido de la array, el orden principal de la fila o la columna principal. Tenemos dos arrays y dos formas (fila y columna mayor) para recorrer cada array. Por lo tanto, puede haber al menos 4 formas diferentes de transformación de la array de origen en la array final.

C++

// C++ program to turn an
// image by 90 Degree
#include <bits/stdc++.h>
using namespace std;
void displayMatrix(unsigned int const *p,
                    unsigned int row,
                   unsigned int col);
                     
void rotate(unsigned int *pS,
            unsigned int *pD,
            unsigned int row,
            unsigned int col);
             
void displayMatrix(unsigned int const *p,
                   unsigned int r,
                   unsigned int c)
{
    unsigned int row, col;
    cout << "\n\n";
 
    for (row = 0; row < r; row++)
    {
        for (col = 0; col < c; col++)
            cout << * (p + row * c + col) << "\t";
        cout << "\n";
    }
 
    cout << "\n\n";
}
 
void rotate(unsigned int *pS,
            unsigned int *pD,
            unsigned int row,
            unsigned int col)
{
    unsigned int r, c;
    for (r = 0; r < row; r++)
    {
        for (c = 0; c < col; c++)
        {
            *(pD + c * row + (row - r - 1)) =
                        *(pS + r * col + c);
        }
    }
}
 
// Driver Code
int main()
{
     
    // declarations
    unsigned int image[][4] = {{1, 2, 3, 4},
                               {5, 6, 7, 8},
                               {9, 10, 11, 12}};
    unsigned int *pSource;
    unsigned int *pDestination;
    unsigned int m, n;
 
    // setting initial values
    // and memory allocation
    m = 3, n = 4, pSource = (unsigned int *)image;
    pDestination = (unsigned int *)malloc
                   (sizeof(int) * m * n);
 
    // process each buffer
    displayMatrix(pSource, m, n);
 
    rotate(pSource, pDestination, m, n);
 
    displayMatrix(pDestination, n, m);
 
    free(pDestination);
 
    return 0;
}
 
// This code is contributed by rathbhupendra

C

// C program to turn an
// image by 90 Degree
#include <stdio.h>
#include <stdlib.h>
 
void displayMatrix(unsigned int const *p,
                   unsigned int row,
                   unsigned int col);
                    
void rotate(unsigned int *pS,
            unsigned int *pD,
            unsigned int row,
            unsigned int col);
             
void displayMatrix(unsigned int const *p,
                   unsigned int r,
                   unsigned int c)
{
    unsigned int row, col;
    printf("\n\n");
 
    for (row = 0; row < r; row++)
    {
        for (col = 0; col < c; col++)
            printf("%d\t", * (p + row * c + col));
        printf("\n");
    }
 
    printf("\n\n");
}
 
void rotate(unsigned int *pS,
            unsigned int *pD,
            unsigned int row,
            unsigned int col)
{
    unsigned int r, c;
    for (r = 0; r < row; r++)
    {
        for (c = 0; c < col; c++)
        {
            *(pD + c * row + (row - r - 1)) =
                            *(pS + r * col + c);
        }
    }
}
 
// Driver Code
int main()
{
     
    // declarations
    unsigned int image[][4] = {{1,2,3,4},
                               {5,6,7,8},
                               {9,10,11,12}};
    unsigned int *pSource;
    unsigned int *pDestination;
    unsigned int m, n;
 
    // setting initial values
    // and memory allocation
    m = 3, n = 4, pSource = (unsigned int *)image;
    pDestination =
        (unsigned int *)malloc
        (sizeof(int) * m * n);
 
    // process each buffer
    displayMatrix(pSource, m, n);
 
    rotate(pSource, pDestination, m, n);
 
    displayMatrix(pDestination, n, m);
 
    free(pDestination);
 
    getchar();
    return 0;
}

Producción :

1    2    3    4    
5    6    7    8    
9    10    11    12    




9    5    1    
10    6    2    
11    7    3    
12    8    4    

Complejidad de tiempo: O (N * M), ya que estamos usando bucles anidados para atravesar la array.

Espacio auxiliar: O(N*M), ya que estamos usando espacio adicional para la array.

Inplace rotar la array cuadrada en 90 grados Compilado por  Venki . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *