如何将数组逆时针旋转并上下翻转?

3

假设这张图片(fig 1)中的每个像素都是一个数组中的元素。我该如何将它逆时针旋转90度(fig 2)并垂直翻转(fig 3)?

图1:fig 1

图2:fig 2

图3:enter image description here

我当前的代码为:

private static Color[][] invert(Color[][] chunk){ //same as rotate
    Color[] temp;
    for(int i=0;i<chunk.length/2;i++){ //reverse the data
        temp=chunk[i];
        chunk[i]=chunk[chunk.length-i-1];
        chunk[chunk.length-i-1]=temp;
    }
    return chunk;
}

private static Color[][] rotate(Color[][] chunk){
    int cx = chunk.length;
    int cz = chunk[0].length;
    Color[][] rotated = new Color[cz][cx];
    for(int x=0;x<cx;++x){
        for(int z=0;z<cz;++z){
            rotated[z][x]=chunk[cz-z-1][x];
        }
    }
    return rotated;
}

反相功能与旋转功能相同。需要帮助吗?
2个回答

3

看起来你正在尝试转置数组 (fig3 = transpose(fig1))。

使用双重循环,并将值保存在条目[i][j]中,该值为[j][i]

更多关于矩阵转置的信息,请参见链接...

所以总的来说,你可以使用transpose获取fig3,然后使用invert获取fig2。


根据你的回答,我得到了:temp = chunk[i][j]; chunk[i][j]=chunk[j][i]; chunk[j][i] = temp; 但是它没有产生任何不同的效果,该部分仍然相同。能帮帮忙吗? - jocopa3
创建一个新的数组result,并将输入数组中的input[i][j]条目保存在result[j][i]条目中。不要对输入数组进行操作! - Baz

2

Baz是正确的,转置将完成任务。 看起来你的转置方法只使用了源数组?如果你循环遍历了两个长度的整个数组,你会撤销你在前半部分所做的所有工作。 这个转置方法对我很有用:

public static Color[] [] transpose (Color[] [] a){
    int[] [] t = new Color [a [0].length] [a.length];
    for (int i = 0 ; i < a.length ; i++){
        for (int j = 0 ; j < a [0].length ; j++){
            t [j] [i] = a [i] [j];
        }
    }
    return t;
}

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