求指点!坐标的变化是如何得来的?
图像旋转翻转变换,给定m行、n列的图像各像素点灰度值,对其依次进行一系列操作后,求得最终图像,其中肯能操作如下四种: A:顺时针旋转90度 输入 2 3 输出 4 1
B:逆时针旋转90度 1 2 3 5 2
C:左右翻转 4 5 6 6 3
D:上下翻转
求操作完成后输出图像结果:
分析过程中:x,y为m*n矩阵中某元素的坐标,x表示行号,y表示列号,操作变化的坐标变化如下:
A:矩阵变成n*m,元素坐标(x,y)变成(y,m-x+1) 求问下,顺时针旋转坐标为什么会变成(y,m-x+1),从何而来,为什么不是x何y互换?顺时针旋转是按中心旋转还是按上下左右4个点旋转?
B:矩阵变成n*m,元素坐标(x,y)变成(n-y+1,x)
C:矩阵还是m*n,元素坐标(x,y)变成(x,n-y+1)
D:矩阵还是m*n,元素坐标(x,y)变成(m-x+1,y)
程序如下:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
int m,n,a[N][N],b[N][N];
string s;
void input()
{
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
cin>>s;
}
int f(char a,int x,int y,int g)
{
if(a=='A') if(!g) return y; else return m-x+1;
if(a=='B') if(!g) return n-y+1; else return x;
if(a=='C') if(!g) return x; else return n-y+1;
if(!g) return m-x+1; else return y;
}
void work()
{
for(int k=0;k<s.length();k++)
{
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
b[f(s[k],i,j,0)][f(s[k],i,j,1)]=a[i][j];
if(s[k]=='A'||s[k]=='B') swap(m,n);
for (int i=1;i<=m;i++) for(int j=1;j<=n;j++)
a[i][j]=b[i][j];
}
}
void output()
{
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++) cout<<a[i][j]<<' ';
cout<<endl;
}
}
int main()
{
input();
work();
output();
return 0;
}