nyoj298_点的变换_错误
点的变换
时间限制: 2000 ms | 内存限制:65535 KB
难度: 5
平面上有不超过10000个点,坐标都是已知的,现在可能对所有的点做以下几种操作:
平移一定距离(M),相对X轴上下翻转(X),相对Y轴左右翻转(Y),坐标缩小或放大一定的倍数(S),所有点对坐标原点逆时针旋转一定角度(R)。
操作的次数不超过1000000次,求最终所有点的坐标。
提示:如果程序中用到PI的值,可以用acos(-1.0)获得。
</dd> </dl>测试数据的第一行是两个整数N,M,分别表示点的个数与操作的个数(N<=10000,M<=1000000)
随后的一行有N对数对,每个数对的第一个数表示一个点的x坐标,第二个数表示y坐标,这些点初始坐标大小绝对值不超过100。
随后的M行,每行代表一种操作,行首是一个字符:
首字符如果是M,则表示平移操作,该行后面将跟两个数x,y,表示把所有点按向量(x,y)平移;
首字符如果是X,则表示把所有点相对于X轴进行上下翻转;
首字符如果是Y,则表示把所有点相对于Y轴进行左右翻转;
首字符如果是S,则随后将跟一个数P,表示坐标放大P倍;
首字符如果是R,则随后将跟一个数A,表示所有点相对坐标原点逆时针旋转一定的角度A(单位是度) </dd> <dt> 输出 </dt> <dd> 每行输出两个数,表示一个点的坐标(对结果四舍五入到小数点后1位,输出一位小数位)
点的输出顺序应与输入顺序保持一致 </dd> <dt> 样例输入 </dt> <dd>
2 5 1.0 2.0 2.0 3.0 X Y M 2.0 3.0 S 2.0 R 180</dd> <dt> 样例输出 </dt> <dd>
-2.0 -2.0 0.0 0.0</dd> </dl>
#include <iostream> #include <cstdio> #include <cmath> #define PI acos(-1.0) using namespace std; struct Point{ double m[3][1]; }; struct matrix2{ double m[3][3]; }; Point point[10005];//点的坐标 matrix2 opera[5];//五种操作的对应矩阵 matrix2 ans; void init(matrix2 &t){ for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ t.m[i][j]=0; } } for(int i=0;i<3;i++){ t.m[i][i]=1; } } matrix2 mult(matrix2 a,matrix2 b){//操作矩阵相乘 matrix2 t; for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ t.m[i][j]=0; for(int k=0;k<3;k++){ t.m[i][j]+=a.m[i][k]*b.m[k][j]; } } } return t; } Point mult2(matrix2 a,Point b){ Point t; for(int i=0;i<3;i++){ for(int j=0;j<1;j++){ t.m[i][j]=0; for(int k=0;k<3;k++){ t.m[i][j]+=a.m[i][k]*b.m[k][j]; } } } return t; } void moper(double p,double q){ ans.m[0][2]+=p; ans.m[1][2]+=q; } void soper(double p){ matrix2 tmp; init(tmp); tmp.m[0][0]=p; tmp.m[1][1]=p; ans=mult(ans,tmp); } void xoper(){ matrix2 tmp; init(tmp); tmp.m[1][1]=-1; an ; } void yoper(){ matrix2 tmp; init(tmp); tmp.m[0][0]=-1; ans=mult(ans,tmp); } void roper(float pp){ matrix2 tmp; init(tmp); double tt=pp/180.0*PI; float aaa=cos(tt); tmp.m[0][0]=aaa; aaa=-sin(tt); tmp.m[0][1]=aaa; aaa=sin(tt); tmp.m[1][0]=aaa; aaa=cos(tt); tmp.m[1][1]=aaa; ans=mult(ans,tmp); } int main() { int N,M; double p=180; double t=p/180.0*PI; printf("%lf",sin(t)); scanf("%d %d",&N,&M); for(int i=0;i<N;i++){ scanf("%lf %lf",&point[i].m[0][0],&point[i].m[1][0]); } char o; double t1,t2; init(ans); for(int i=0;i<M;i++){ getchar(); scanf("%c",&o); if(o=='X'){ xoper(); continue; } if(o=='Y'){ yoper(); continue; } if(o=='M'){ scanf("%lf %lf",&t1,&t2); moper(t1,t2); continue; } if(o=='S'){ scanf("%lf",&t1); soper(t1); continue; } if(o=='R'){ scanf("%lf",&t1); roper(t1); continue; } } for(int i=0;i<N;i++){ Point tt; tt=mult2(ans,point[i]); printf("%.1lf %.1lf\n",tt.m[0][0],tt.m[1][0]); } return 0; }