2013-02-16 3 views
0

시계 방향 회전에 대해서는 알고리즘을 보았지만 반대 방향으로는 할 수 없습니다. 그래서 기본적으로 시계 방향 회전의 경우 회전 행렬에 조 변경을 곱해야하지만 같은 방법으로 다른 방법을 수행합니까? 오른쪽테트리스 피스를 시계 반대 방향으로 어떻게 회전합니까?

public class rotation2 { 

    public static int [][] multiplyMatrix(int [][] m1) { 
     int [][] m2 = {{0,0,0,1}, 
         {0,0,1,0}, 
         {0,1,0,0}, 
         {1,0,0,0}}; 
     int[][] result = new int[4][4]; 

     // multiply 
     for (int i=0; i<4; i++) 
      for (int j=0; j<4; j++) 
       for (int k=0; k<4; k++) 
        result[i][j] += m1[i][k] * m2[k][j]; 

     return result; 
    } 

    public static int [][] multiplyMatrix2(int [][] m2) { 
     int [][] m1 = {{0,0,0,1}, 
         {0,0,1,0}, 
         {0,-1,0,0}, 
         {-1,0,0,0}}; 
     int[][] result = new int[4][4]; 

     // multiply 
     for (int i=0; i<4; i++) 
      for (int j=0; j<4; j++) 
       for (int k=0; k<4; k++) 
        result[i][j] += m1[i][k] * m2[k][j]; 

     return result; 
    } 

    public static void printArray(int [][] array) { 
     for(int row = 0; row < array.length; row++) { 
      for(int col = 0; col < array[row].length; col++) { 
       if (array[row][col] > 0) { 
        System.out.printf("1"); 
       } else { 
        System.out.printf("0"); 
       } 
      } 
      System.out.printf("\n"); 
     } 
    } 

    public static int [][] transpose(int [][] m1) { 
     int m = 4; 
     int n = 4; 
     int c = 0; 
     int d = 0; 

     int[][] transpose = new int [n][m]; 

     for (c = 0 ; c < m ; c++) { 
      for (d = 0 ; d < n ; d++) { 
       transpose[d][c] = m1[c][d]; 
      } 
     } 
     return transpose; 
    } 

    public static void main(String[] args) { 
     int [][] m1 = {{1,0,0,0}, 
         {1,0,0,0}, 
         {1,1,0,0}, 
         {0,0,0,0}}; 

     int [][] transpose = transpose(m1); 
     printArray(transpose); 
     transpose = multiplyMatrix(transpose); 
     printArray(transpose); 

     int [][] transpose2 = transpose(m1); 
     printArray(transpose2); 
     transpose2 = multiplyMatrix(transpose2); 
     printArray(transpose2); 
    } 
} 

당신은 카운터 시계 회전 트랜스하지 않습니다

여기 내 코드입니까?

+0

이 이전 [질문] (http://stackoverflow.com/q/14867570/230513)도 참조하십시오. – trashgod

답변

0

당신이해야 할 일은 (1) 행렬을 조 변경하고 (2) 행을 (시계 방향) 또는 열 (반 시계 방향)으로 각각 역변환하는 것입니다.

동시에 두 단계를 수행하여 double-for-loop를 사용하여 개별 셀의 새 값을 설정할 수 있습니다. 코드에서, 이것은 다음과 같습니다

public static int[][] rotate(int[][] m, boolean left) { 
    int rows = m.length, cols = m[0].length; 
    int[][] m2 = new int[cols][rows]; // swap rows and cols 
    for (int r = 0; r < rows; r++) 
     for (int c = 0; c < cols; c++) 
      if (left) // rotate left 
       m2[c][r] = m[r][cols - c - 1]; 
      else  // rotate right 
       m2[c][r] = m[rows - r - 1][c]; 
    return m2; 
} 

자세한 내용과 다른 접근 방식의 경우, this related question에 대한 답변에서보세요.

관련 문제