将矩阵旋转到位

时间:2013-12-25 14:18:46

标签: java arrays image-rotation

我正在解决旋转NxN矩阵问题。

似乎我的代码进行了旋转,但在图像上留下了一个X. 所以我猜它正在不正确地旋转边缘。 我附加了两个图像作为样本输入和输出。

enter image description here enter image description here

我的代码出了什么问题:

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;
        }
    }       
}

2 个答案:

答案 0 :(得分:1)

您正在旋转主对角线两次。

修复内循环(参见&#34;修复&#34;评论)

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;
            }
        }       
    }
}

答案 1 :(得分:0)

如果您要旋转图片,我建议您使用java.awt.geom.AffineTransform

如果这是关于矩阵轮换的仅逻辑问题,我相信您可以通过将(一个或两个?)<替换为<=来更正结果。另请注意,您的图片尺寸为309x309(奇数!),而您的中间部分未经N/2修正。可能的解决方案是添加1 - 将N/2替换为

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