nyoj--298 点的变换(矩阵)

来源:互联网 发布:vm linux 共享文件夹 编辑:程序博客网 时间:2024/06/05 19:39

nyoj 298

题解

参阅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;}// translationvoid 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 downvoid 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 rightvoid 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 timesvoid 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 counterclockwisevoid 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;}
0 0
原创粉丝点击