我正在解决旋转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;
}
}
}
答案 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