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\n",tt.m[0][0],tt.m[1][0]);
    }
    return 0;
}

 

posted @ 2016-10-06 17:04  多一份不为什么的坚持  阅读(202)  评论(0编辑  收藏  举报