题解
参阅Matrix67大神的十个利用矩阵乘法解决的经典题目
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 10000 + 10;
const double pi = acos(-1.0);
struct point{ double x, y; };
point p[maxn];
int n, m;
struct mat{
double M[3][3];
mat(){ memset(M, 0, sizeof(M)); }
};
mat mul(mat& A, mat& B)
{
mat C;
for(int i = 0; i < 3; ++i)
for(int j = 0; j < 3; ++j)
for(int k = 0; k < 3; ++k)
C.M[i][j] += A.M[i][k] * B.M[k][j];
return C;
}
// translation
void M(mat& A, double x, double y)
{
mat E;
E.M[0][0] = 1, E.M[0][1] = 0, E.M[0][2] = x;
E.M[1][0] = 0, E.M[1][1] = 1, E.M[1][2] = y;
E.M[2][0] = 0, E.M[2][1] = 0, E.M[2][2] = 1;
A = mul(E, A);
}
// up and down
void X(mat& A)
{
mat E;
E.M[0][0] = 1, E.M[0][1] = 0, E.M[0][2] = 0;
E.M[1][0] = 0, E.M[1][1] = -1, E.M[1][2] = 0;
E.M[2][0] = 0, E.M[2][1] = 0, E.M[2][2] = 1;
A = mul(E, A);
}
// left and right
void Y(mat& A)
{
mat E;
E.M[0][0] = -1, E.M[0][1] = 0, E.M[0][2] = 0;
E.M[1][0] = 0, E.M[1][1] = 1, E.M[1][2] = 0;
E.M[2][0] = 0, E.M[2][1] = 0, E.M[2][2] = 1;
A = mul(E, A);
}
// magnify p times
void S(mat& A, double p)
{
mat E;
E.M[0][0] = p, E.M[0][1] = 0, E.M[0][2] = 0;
E.M[1][0] = 0, E.M[1][1] = p, E.M[1][2] = 0;
E.M[2][0] = 0, E.M[2][1] = 0, E.M[2][2] = 1;
A = mul(E, A);
}
// rotate counterclockwise
void R(mat& A, double angle)
{
mat E;
double radian = angle * pi / 180;
E.M[0][0] = cos(radian), E.M[0][1] = -sin(radian), E.M[0][2] = 0;
E.M[1][0] = sin(radian), E.M[1][1] = cos(radian), E.M[1][2] = 0;
E.M[2][0] = 0, E.M[2][1] = 0, E.M[2][2] = 1;
A = mul(E, A);
}
int main()
{
//freopen("data.in", "r", stdin);
cin >> n >> m;
for(int i = 0; i < n; ++i) scanf("%lf %lf", &p[i].x, &p[i].y);
char op;
double x, y;
mat A;
for(int i = 0; i < 3; ++i) A.M[i][i] = 1;
while(m--)
{
cin >> op;
if(op == 'X') X(A);
if(op == 'Y') Y(A);
if(op == 'M'){
scanf("%lf %lf", &x, &y);
M(A, x, y);
}
if(op == 'S'){
scanf("%lf", &x);
S(A, x);
}
if(op == 'R'){
scanf("%lf", &x);
R(A, x);
}
}
for(int i = 0; i < n; ++i)
{
mat B;
B.M[0][0] = p[i].x, B.M[1][0] = p[i].y, B.M[2][0] = 1;
B = mul(A, B);
printf("%.1f %.1f\n", B.M[0][0], B.M[1][0]);
}
return 0;
}