点的变换

时间限制: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;
}

转载于:https://www.cnblogs.com/TWS-YIFEI/p/5934113.html

nyoj298_点的变换_错误相关推荐

  1. python 霍夫直线变换_霍夫线变换

    目录:一.引入极坐标 二.霍夫线变换实现原理 三.图像中的霍夫线变换 四.概率霍夫变换 五.Python 例子 六.参考 Hough线变换是一种用于检测直线的变换.它最大的优点是,即使是虚线(dash ...

  2. excel表格横向纵向变换_从Python到Excel

    在Python的CommandLine中输入: [四大基本运算] a1=100 a2=3 print( a1+a2 ) print ( a1-a2) print ( a1 * a2) print ( ...

  3. 3704对象关闭时_错误号:3704 错误描述:对象关闭时,不允许操作

    本文关键详细介绍了错误号:3704 错误描述:对象关掉时,不允许实际操作,必须的盆友能够参照下 "错误号:3704 错误描述:对象关掉时,不允许实际操作.sql=select top 10 ...

  4. 二维小波变换_很好的一篇小波变换的基础介绍

    话说很早以前,我们接触的信号频域处理基本都是傅立叶和拉普拉斯的天下.但这些年,小波在信号分析中的逐渐兴盛和普及.这让人不得不感到好奇,是什么特性让它在图象压缩,信号处理这些关键应用中更得到信赖呢?说实 ...

  5. main方法_错误: 在类 ZiFUChuan.Pyramid 中找不到 main 方法, 请将 main 方法定义为:

    错误: 在类 ZiFUChuan.Pyramid 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 Java ...

  6. linux编译mysql报无法将左值_'错误:无法将'std::ostream {aka std::basic_ostream

    我用这个模板读了类似的问题. 我没有模板,但我有同样的错误.这是我第一次重载< 我有三个文件.主文件,.h文件和.cpp文件. Team类使用了我实现的另一个类,但我不认为这个错误是由这个类引起 ...

  7. PHP常用功能块_错误和异常处理 — php(32)

    一.错误和异常处理 1.1 错误类型和基本的调试方法 PHP程序的错误发生一般归属于下列三个领域: 语法错误: 语法错误最常见,并且也容易修复.如:代码中遗漏一个分号.这类错误会阻止脚本的执行. 运行 ...

  8. mysql不能写重复键_错误1022-无法写入;表中的重复键

    关于create table命令上的重复键,我收到1022错误.看完查询后,我不知道在哪里进行复制.有人可以看到吗? SQL query: -- --------------------------- ...

  9. 如何求解单边z变换_的单边Z变换。.ppt

    第8章 Z变换与离散时间系统的Z域分析 8.1 Z变换的定义 8.2 双边Z变换与单边Z变换的关系 8.3 Z变换的收敛域 8.4 常用序列的Z变换 8.5 Z变换的性质 8.6 Z反变换 8.7 Z ...

最新文章

  1. 国外10大IT网站和博客网站
  2. FPGA之道(27)VHDL的操作符号
  3. Savior:渗透测试报告自动生成工具
  4. 操作系统-银行家算法
  5. 构建之法阅读笔记(1)
  6. 广西2019全国计算机二级报名,广西2019年3月全国计算机二级考试报名入口已开通...
  7. 编程:从前有一个傻呆程序员,老婆交给他一项任务,他办了四次才满意
  8. as ssd中文版测试软件,AS SSD Benchmark
  9. Java程序员简历模板,内含个人专业技能和项目经验介绍
  10. Node2Vec实战
  11. 台式计算机装机,DIY台式电脑装机教程之新手装机图解!手把手教你组装电脑
  12. LaTex中插入超链接
  13. html 操作cookie,HtmlUnit 模拟浏览器以及Cookie使用示例
  14. 增长智能引领营销数字化,数字中台掌控消费者旅程
  15. Unveiling causal interactions in complex systems(揭示复杂系统中的因果交互作用)
  16. C#转Java心路历程
  17. 计算机主板的安装过程,电脑主板安装四大步骤全程讲解
  18. 《职来职往》里的经典语录,总有一句震惊到你!
  19. 人脸识别用哪种python库_python的face_recognition人脸识别库的使用
  20. java实现堆栈_Java实现一个简单的堆栈

热门文章

  1. Struts2学习笔记——Struts2与Spring整合
  2. 人民大学云计算编程的网上评估平台--解题报告 1004-1007
  3. SQL查询入门(下篇)
  4. 算法:删除排序数组中的重复项||
  5. 常考数据结构与算法:判断二叉树是否对称(迭代法,递归法)
  6. 前端一HTML:二十CSS的三种存在方式
  7. 汇编:CF(carry flag)标志位
  8. 专访阿里云MVP王俊杰:开发者的超能力是用技术让世界更美好
  9. PHP 5.6.32 增加pdo_dblib.so拓展
  10. Jdk1.6 JUC源码解析(13)-LinkedBlockingQueue