旋转图像

Posted Delta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转图像相关的知识,希望对你有一定的参考价值。

给定一个 × n 的二维矩阵表示一个图像。

将图像顺时针旋转 90 度。示例如下:

给定 matrix =
[
  [ 5, 1, 9,11],
  [ 2, 4, 8,10],
  [13, 3, 6, 7],
  [15,14,12,16]
], 

原地旋转输入矩阵,使其变为:
[
  [15,13, 2, 5],
  [14, 3, 4, 1],
  [12, 6, 8, 9],
  [16, 7,10,11]
]

 

对于matrix中的元素matrix[i][j],将其旋转90度后,对应的位置为matrix[j][M-i],M为n-1

如matrix[0][0]的值为5, 旋转后matrix[0][3-0]的值为5

   matrix[1][0]的值为2,旋转后matrix[0][3-1]的值为2

 

实现方法:

先将矩阵最外的一圈旋转,接着逐渐将内部的圈旋转。

如矩阵

5

1

9

11

2

4

8

10

13

3

6

7

15

14

12

16

首先旋转最外面的一圈,接着旋转里面的一圈。

最外面一圈只需将5、1、9旋转完成即可,最里面的一圈只需要旋转4即可

5->11   11->16  16->15  15->5,同样的方法旋转1、9

 

对于n x n的矩阵

第一圈需要旋转n-1个元素,matrix[0][0]  -    matrix[0][n-2]

第二圈需要旋转n-3个元素,matrix[1][1]  -   matrix[1][n-3]

第三圈n-5

。。。

如下图所示:

 

 代码如下:

    public static void rotate(int[][] matrix) {

        int M = matrix.length - 1;
        // 每行需要旋转的元素个数
        int len = M;
        int temp;
        int i=0, j=0;
        while (len > 0) {

            for (j=i; j<i+len; j++) {
                // 旋转四个元素
                temp = matrix[j][M-i];
                matrix[j][M-i] = matrix[i][j];
                matrix[i][j] = matrix[M-j][i];
                matrix[M-j][i] = matrix[M-i][M-j];
                matrix[M-i][M-j] = temp;
            }
            i++;
            len -= 2;
        }
    }

 

以上是关于旋转图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 ActionBar 旋转 Android 的双片段

Butterknife 片段旋转给出 NullPointer

导航后未附加回收站视图

如何在Win2D中旋转矩形

如何在没有活动旋转的情况下旋转活动内的片段?

代码题(38)— 旋转图像矩阵置零