• nyoj298_点的变换_错误


    点的变换

    时间限制:2000 ms  |  内存限制:65535 KB
    难度:5
     
    描述

    平面上有不超过10000个点,坐标都是已知的,现在可能对所有的点做以下几种操作:

    平移一定距离(M),相对X轴上下翻转(X),相对Y轴左右翻转(Y),坐标缩小或放大一定的倍数(S),所有点对坐标原点逆时针旋转一定角度(R)。    

    操作的次数不超过1000000次,求最终所有点的坐标。

    提示:如果程序中用到PI的值,可以用acos(-1.0)获得。

     
    输入
    只有一组测试数据
    测试数据的第一行是两个整数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(单位是度)
    输出
    每行输出两个数,表示一个点的坐标(对结果四舍五入到小数点后1位,输出一位小数位)
    点的输出顺序应与输入顺序保持一致
    样例输入
    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
    ",tt.m[0][0],tt.m[1][0]);
        }
        return 0;
    }
  • 相关阅读:
    如何创建自己的SAP CRM产品主数据search scenario
    互联网商业数据分析(六十九):数据可视化Tableau篇(九)其他知识点
    互联网商业数据分析(六十八):数据可视化Tableau篇(八)可视化项目(二)
    互联网商业数据分析(六十七):数据可视化Tableau篇(七)可视化项目(一)
    ubuntu关闭时间同步与centos更改时间
    对比Intel和Kunpeng+ openEuler
    pci config + resource
    IORESOURCE_MEM IORESOURCE_IO
    PCIE的mmio内存映射访问机制+ 配置空间 +mmap + resource + /dev/mem
    mmap PROT_READ | PROT_WRITE
  • 原文地址:https://www.cnblogs.com/TWS-YIFEI/p/5934113.html
Copyright © 2020-2023  润新知