Java Rotate 2d Array 90 degrees in clockwise
public static void rotate90(int[][] arr){
if(arr != null){
int len = arr.length;
for(int k=0; k < len/2; k++){
for(int i=k; i < len-1-k; i++){
int tmp = arr[k][i];
arr[k][i] = arr[len-1-i][k];
arr[len-1-i][k] = arr[len-1-k][len-1-i];
arr[len-1-k][len-1-i] = arr[i][len-1-k];
arr[i][len-1-k] = tmp;
}
}
}
}
--------------------
[1][2][3]
[4][5][6]
[7][8][9]
--------------------
[7][4][1]
[8][5][2]
[9][6][3]
--------------------
How to do it in Haskell
let mat = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
mapM_ print mat $ flip (.) reverse transpose mat
-- =>
[7,4,1]
[8,5,2]
[10,6,3]
Rotate 90 degree in counter-clockwise
[ ][ ][x]
[ ][ ][ ]
[ ][ ][ ]
transpose =>
[ ][ ][ ]
[ ][ ][ ]
[x][ ][ ]
reverse =>
[x][ ][ ] ↑
[ ][ ][ ] -
[ ][ ][ ] ↓
Rotate 90 degree in clockwise
[ ][ ][x]
[ ][ ][ ]
[ ][ ][ ]
reverse =>
[ ][ ][ ] ↑
[ ][ ][ ] -
[ ][ ][x] ↓
transpose =>
[ ][ ][ ]
[ ][ ][ ]
[ ][ ][x]
What if we want to rotate 90 degrees in counterclosewise?
let mat = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
mapM_ print mat $ flip (.) reverse transpose mat
-- =>
[7,4,1]
[8,5,2]
[10,6,3]
Rotate 2d array 90 degrees with geometry technic.
How to find a vector that is perpendicular to $v$
1. find the reflection of $v$ about the line $y = x$
2. flip the reflection point about $x$-Axis
1. Given a vector $v$
2. $w$ is the reflection about $y=x$
3. $w_{1}$ is the flip of reflection point about $x$-Axis
4. we have: $w_{1} \perp v$
5. we can apply above processes to rotate 2d array in 90 degrees in clockwise
Note: If we want to rotate 2d array 90 degrees in counter-clockwise
we need to flip the reflection point about $y$-Axis
/**
* Rotate 2d array 90 degrees in counter-clockwise
*
* 1. swap x, y. e.g. (x, y) -> (y, x)
* 2. swap elements: [k][i], [k][len-1-i].
* e.g tmp = arr[k][i],
* arr[k][i] = arr[k][len - 1 - i], arr[k][len-1-i] = tmp
*/
public static void rotateArr90(int[][] arr){
if(arr != null){
// assume the lengths of row and column are the same
int len = arr.length;
// (x, y) -> (y, x)
for(int i=0; i < len; i++){
for(int j=i; j < len; j++){
int tmp = arr[i][j];
arr[i][j] = arr[j][i];
arr[j][i] = tmp;
}
}
// flip all rows
for(int i=0; i < len; i++){
for(int j=0; j < len/2; j++){
int tmp = arr[i][j];
arr[i][j] = arr[i][len - 1 - j];
arr[i][len - 1 - j] = tmp;
}
}
}
}