标签:
平面上有不超过10000个点,坐标都是已知的,现在可能对所有的点做以下几种操作:
平移一定距离(M),相对X轴上下翻转(X),相对Y轴左右翻转(Y),坐标缩小或放大一定的倍数(S),所有点对坐标原点逆时针旋转一定角度(R)。
操作的次数不超过1000000次,求最终所有点的坐标。
提示:如果程序中用到PI的值,可以用acos(-1.0)获得。
2 5 1.0 2.0 2.0 3.0 X Y M 2.0 3.0 S 2.0 R 180
-2.0 -2.0 0.0 0.0
#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; }
标签:
原文地址:http://www.cnblogs.com/TWS-YIFEI/p/5934113.html