点的变换

来源:互联网 发布:期货自动交易编程 编辑:程序博客网 时间:2024/05/29 10:10

题意(原题):
给出n个点,m个操作。
对每个点都进行这m个操作。
操作有平移、翻转、放大、旋转。
n<=10000,m<=1000000
思路:
暴力肯定会超时。
把每个操作都当成一个矩阵,再把这些操作都乘起来,再分别乘以每个点即可。
手推容易算出。
代码:

#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>using namespace std;struct node{    int xcnt,ycnt;    double a[4][4];    node()    {        xcnt=0;ycnt=0;        for(int i=1;i<=3;i++)            for(int j=1;j<=3;j++)                a[i][j]=0.0;    }}p[11000];char ss[11];node py(double x,double y){    node a;    a.xcnt=3;a.ycnt=3;    a.a[1][1]=1.0;a.a[1][2]=0.0;a.a[1][3]=x;    a.a[2][1]=0.0;a.a[2][2]=1.0;a.a[2][3]=y;    a.a[3][1]=0.0;a.a[3][2]=0.0;a.a[3][3]=1.0;    return a;}node xfz(){    node a;    a.xcnt=3;a.ycnt=3;    a.a[1][1]=1.0;a.a[1][2]=0.0;a.a[1][3]=0.0;    a.a[2][1]=0.0;a.a[2][2]=-1.0;a.a[2][3]=0.0;    a.a[3][1]=0.0;a.a[3][2]=0.0;a.a[3][3]=1.0;    return a;}node yfz(){    node a;    a.xcnt=3;a.ycnt=3;    a.a[1][1]=-1.0;a.a[1][2]=0.0;a.a[1][3]=0.0;    a.a[2][1]=0.0;a.a[2][2]=1.0;a.a[2][3]=0.0;    a.a[3][1]=0.0;a.a[3][2]=0.0;a.a[3][3]=1.0;    return a;}node fd(double p){    node a;    a.xcnt=3;a.ycnt=3;    a.a[1][1]=p;a.a[1][2]=0.0;a.a[1][3]=0.0;    a.a[2][1]=0.0;a.a[2][2]=p;a.a[2][3]=0.0;    a.a[3][1]=0.0;a.a[3][2]=0.0;a.a[3][3]=1.0;    return a; }node xz(int p){    double pai=acos(-1.0),x=pai*p/180.0;    node a;    a.xcnt=3;a.ycnt=3;    a.a[1][1]=cos(x);   a.a[1][2]=-sin(x); a.a[1][3]=0.0;    a.a[2][1]=sin(x);   a.a[2][2]=cos(x);  a.a[2][3]=0.0;    a.a[3][1]=0.0;      a.a[3][2]=0.0;     a.a[3][3]=1.0;    return a;} node cf(node x,node y){    node ans;    ans.xcnt=x.xcnt;ans.ycnt=y.ycnt;    for(int i=1;i<=x.xcnt;i++)    {        for(int j=1;j<=y.ycnt;j++)        {            for(int k=1;k<=x.ycnt;k++)            {                ans.a[i][j]+=x.a[i][k]*y.a[k][j];            }        }    }    return ans;}int main(){    int n,m;    scanf("%d%d",&n,&m);    double x,y;int z;    node opt,inopt;    for(int i=1;i<=n;i++)    {        scanf("%lf%lf",&p[i].a[1][1],&p[i].a[2][1]);        p[i].a[3][1]=1;        p[i].xcnt=3;p[i].ycnt=1;    }    for(int i=1;i<=m;i++)    {        scanf("%s",ss+1);        if(ss[1]=='M')        {            scanf("%lf%lf",&x,&y);            inopt=py(x,y);        }        if(ss[1]=='X')            inopt=xfz();        if(ss[1]=='Y')            inopt=yfz();        if(ss[1]=='S')        {            scanf("%lf",&x);            inopt=fd(x);        }        if(ss[1]=='R')        {            scanf("%d",&z);            inopt=xz(z);        }        if(i==1)            opt=inopt;        else opt=cf(inopt,opt);    }    for(int i=1;i<=n;i++)    {        node x=cf(opt,p[i]);        printf("%.1lf %.1lf\n",x.a[1][1],x.a[2][1]);    }    return 0;}
原创粉丝点击