2013-12-25 9 views
7

Ich lösen die drehen Sie eine NxN-Matrix an Ort und Stelle Frage.Matrix an Ort und Stelle drehen

Es scheint, dass mein Code eine Drehung macht, aber ein X über das Bild lässt.
Also ich vermute, es dreht die Kanten falsch. Ich befestige zwei Bilder als Beispiel Eingabe und Ausgabe.

enter image description hereenter image description here

Was mit meinem Code falsch:

public static void rotateRight(float[][] img){ 
    for (int i=0; i<N/2; i++){ 
     for (int j=i; j<N-i; j++){ 
      int J_COMP = N-j-1; //complement of J 
      int LEFT = i; 
      int RIGHT = N-i-1; 
      int TOP = i; 
      int BOTTOM = N-i-1; 

      float temp = img[J_COMP][LEFT]; 
      img[J_COMP][LEFT] = img[BOTTOM][J_COMP]; 
      img[BOTTOM][J_COMP] = img[j][RIGHT]; 
      img[j][RIGHT] = img[TOP][j]; 
      img[TOP][j] = temp; 
     } 
    }  
} 
+3

Warum verwenden Sie nicht einen Debugger, um herauszufinden, was es tut? –

+1

Der obige Kommentar hilft nicht viel – ravindrab

Antwort

1

Sie werden zweimal Hauptdiagonalen drehen.

innere Schleife Fix (siehe "fix" Kommentar)

package tests.StackOverflow; 

public class Question_20773692 { 

    private static int N; 

    public static void main(String[] args) { 

     float[][] img; 
     int count; 

     N=3; 
     count = 0; 
     img = new float[N][N]; 
     for(int i=0; i<N; ++i) { 
      for(int j=0; j<N; ++j) { 
       img[i][j] = count++; 
      } 
     } 

     printImg(img); 

     rotateRight(img); 

     printImg(img); 

    } 

    public static void printImg(float[][] img) { 
     for(int j=0; j<N; ++j) { 
      System.out.print("-"); 
     } 
     System.out.println(); 
     for(int i=0; i<N; ++i) { 
      for(int j=0; j<N; ++j) { 
       System.out.print((int)(img[i][j])); 
      } 
      System.out.println(); 
     } 
     for(int j=0; j<N; ++j) { 
      System.out.print("-"); 
     } 
     System.out.println(); } 

    public static void rotateRight(float[][] img){ 
     for (int i=0; i<N/2; i++){ 
      for (int j=i; j<N-i; j++){ 
      //for (int j=i+1; j<N-i; j++){ //fix 
       int J_COMP = N-j-1; //complement of J 
       int LEFT = i; 
       int RIGHT = N-i-1; 
       int TOP = i; 
       int BOTTOM = N-i-1; 

       float temp = img[J_COMP][LEFT]; 
       img[J_COMP][LEFT] = img[BOTTOM][J_COMP]; 
       img[BOTTOM][J_COMP] = img[j][RIGHT]; 
       img[j][RIGHT] = img[TOP][j]; 
       img[TOP][j] = temp; 
      } 
     }  
    } 
} 
0

Wenn Sie rotierendes Bild sind, würde ich java.awt.geom.AffineTransform

Wenn dies logischer nur Frage zu Matrix Rotation zu verwenden, empfehlen Ich glaube, Sie können Ihr Ergebnis korrigieren, indem Sie (eins oder beide?) < zu <= ersetzen. Beachten Sie auch, dass Ihr Bild eine Größe von 309x309 (ungerade Zahlen!) Hat und Sie die Mitte nicht durch N/2 korrigiert haben. Mögliche Lösung 1 hinzufügen - ersetzen N/2 zu

N % 2 == 0 ? N/2 : N/2 + 1

1

In-Place-Rotation Matrix .... Ich denke, das sollte funktionieren.

public void rotate(ArrayList<ArrayList<Integer>> a) { 
    int n=a.size()/2; 
    for(int i=1;i<=n;i++){ 
     ArrayList<Integer>temp=a.get(i-1); 
     a.set(i-1,a.get(a.size()-i)); 
     a.set(a.size()-i,temp); 
    } 
    for(int i=0;i<a.size();i++){ 
     for(int j=i+1;j<a.get(0).size();j++){ 
      a.get(i).set(j,a.get(i).get(j)^a.get(j).get(i)); 
      a.get(j).set(i,a.get(i).get(j)^a.get(j).get(i)); 
      a.get(i).set(j,a.get(i).get(j)^a.get(j).get(i)); 
    } 
} 
} 
Verwandte Themen