在原地旋转矩阵

7
我正在解决“原地旋转NxN矩阵”的问题。
我的代码似乎进行了旋转,但在图像上留下了一个X。
所以我猜测它错误地旋转了边缘。我附加了两个图像作为示例输入和输出。
请问我的代码哪里有问题:
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
你为什么不使用调试器来找出它正在做什么? - Oliver Charlesworth
1
以上的评论并没有提供太多帮助。 - ravindrab
3个回答

1

矩阵的原地旋转...我猜这应该可以工作。

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

1
你正在对主对角线旋转两次。
修复内层循环(参见“修复”注释)。
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

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

如果这是关于矩阵旋转的逻辑问题,我相信您可以通过将(一个或者两个?)<替换为<=来纠正您的结果。此外,请注意您的图片大小为309x309(奇数!),您留下了中间没有通过N/2进行更正的部分。可能的解决方案是添加1 - 将N/2替换为

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接