点的变换

时间限制: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[][];
}; struct matrix2{
double m[][];
}; Point point[];//点的坐标
matrix2 opera[];//五种操作的对应矩阵
matrix2 ans; void init(matrix2 &t){
for(int i=;i<;i++){
for(int j=;j<;j++){
t.m[i][j]=;
}
}
for(int i=;i<;i++){
t.m[i][i]=;
}
} matrix2 mult(matrix2 a,matrix2 b){//操作矩阵相乘
matrix2 t;
for(int i=;i<;i++){
for(int j=;j<;j++){
t.m[i][j]=;
for(int k=;k<;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=;i<;i++){
for(int j=;j<;j++){
t.m[i][j]=;
for(int k=;k<;k++){
t.m[i][j]+=a.m[i][k]*b.m[k][j];
}
}
}
return t;
} void moper(double p,double q){
ans.m[][]+=p;
ans.m[][]+=q;
} void soper(double p){
matrix2 tmp;
init(tmp);
tmp.m[][]=p;
tmp.m[][]=p;
ans=mult(ans,tmp);
} void xoper(){
matrix2 tmp;
init(tmp);
tmp.m[][]=-;
an ;
} void yoper(){
matrix2 tmp;
init(tmp);
tmp.m[][]=-;
ans=mult(ans,tmp);
} void roper(float pp){
matrix2 tmp;
init(tmp);
double tt=pp/180.0*PI; float aaa=cos(tt);
tmp.m[][]=aaa; aaa=-sin(tt);
tmp.m[][]=aaa; aaa=sin(tt);
tmp.m[][]=aaa; aaa=cos(tt);
tmp.m[][]=aaa; ans=mult(ans,tmp);
} int main()
{
int N,M; double p=;
double t=p/180.0*PI;
printf("%lf",sin(t)); scanf("%d %d",&N,&M);
for(int i=;i<N;i++){
scanf("%lf %lf",&point[i].m[][],&point[i].m[][]);
}
char o;
double t1,t2;
init(ans);
for(int i=;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=;i<N;i++){
Point tt;
tt=mult2(ans,point[i]);
printf("%.1lf %.1lf\n",tt.m[][],tt.m[][]);
}
return ;
}

nyoj298_点的变换_错误的更多相关文章

  1. BZOJ_1692_[Usaco2007 Dec]队列变换_后缀数组

    BZOJ_1692_[Usaco2007 Dec]队列变换_后缀数组 Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛” ...

  2. python开发环境_windows系统安装_错误记录

    1 安装python编译器2.7.11版本 (安装包自带pip,setuptools,依赖,会将pip,setuptools安装到自己的类库中) 配置环境变量: 配置python_home,然后加入p ...

  3. CSS3_过渡_2D 变换_瓶体旋转_动态时钟

    1. 过渡 transition 允许 CSS 的属性值在一定时间内平滑的过渡, 在鼠标点击,鼠标滑过或对属性改变中触发,并圆滑的改变 CSS 的属性值 简写属性: #box { width: 300 ...

  4. Go指南练习_错误

    源地址 https://tour.go-zh.org/methods/20 一.题目描述 从之前的练习中复制 Sqrt 函数,修改它使其返回 error 值. Sqrt 接受到一个负数时,应当返回一个 ...

  5. PREV-5_蓝桥杯_错误票据

    问题描述 某涉密单位下发了某种票据,并要在年终全部收回. 每张票据有唯一的ID号.全年所有票据的ID号是连续的,但ID的开始数码是随机选定的. 因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成 ...

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

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

  7. VC++_错误 无法打开包括文件“glglut.h” No such file or directory 怎么办

    在网上看到类似的问题,查找资料找到了解决方案,现整理如下,有些更改,好让自己多些印象,附原文网址:http://blog.csdn.net/bigloomy/article/details/62265 ...

  8. [bzoj1692][Usaco2007 Dec]队列变换_后缀数组_贪心

    队列变换 bzoj-1692 Usaco-2007 Dec 题目大意:给定一个长度为$n$的字符串.每次从头或尾取出一个字符加到另一个字符串里.要求变换后生成的字符串字典序最小,求字典序最小的字符串. ...

  9. idea初见问题整理_错误: -source 1.5 中不支持 diamond 运算符

    最近在移动工程到idea下,顺便改目录结构,遇到的问题不一定全部记录,有些答案摘抄自别人博客,已注明来源,由于不是摘抄自同一作者,且有自己的一些内容,所以标注为原创. 1.(错误: -source 1 ...

随机推荐

  1. Book-编程珠玑-第一章

    第一章...二〇一六年十月二十五日 22:41:45 1MB存储空间里大约可以存143,000个号码; 如果每个号码都使用32位整数来表示的话,1MB存储空间里就可以存储250,000个号码; 看得迷 ...

  2. Android中实现圆角矩形及半透明效果。

    注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 在做Android开发时,我们为了美观,有时候需要使用圆角矩形,或半透明之类的效果,在网页设计中很容易实现.但在Android开发中 ...

  3. indexPathForCell returns nil since ios7

    -(UITableViewCell*)GetCellFromTableView:(UITableView*)tableView Sender:(id)sender { CGPoint pos = [s ...

  4. 关于css3的动画总结

    旋转:transform:rotate(xxdeg)扭曲:transform:skey(x,y)缩放:transform:scale(x,y)变形位移:transform:translate(x,y) ...

  5. SDK 移动应用开发系统

    AppCan SDK 是一套跨平台移动应用开发系统,基于业内领先的Hybrid App 开发引擎,采用HTML5 标准作为开发语言,支持一次开发多平台适配.AppCan SDK 提供应用向导和界面向导 ...

  6. CSS选择器的特殊性和LOVE HA

    在CSS中当几个相同的选择器对同一个元素有不同的规则时,该怎么应用这些规则呢? 答案就是:CSS特殊性(CSS specificity) 选择器特殊性有选择器本身组成,特殊性由4个数值表述:0, 0, ...

  7. test dword ptr [eax],eax ; probe page. visual studio

    当在函数中申请占用空间很大的数组.结构体时,会产生该问题. 由于局部变量的申请空间存放于栈中,windows里默认栈内存是1M 所以当申请空间大于1M时就会出现溢出错误 通过debug就会进入以下文件 ...

  8. HDU 4793 Collision(2013长沙区域赛现场赛C题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4793 解题报告:在一个平面上有一个圆形medal,半径为Rm,圆心为(0,0),同时有一个圆形范围圆心 ...

  9. [BZOJ3572][Hnoi2014]世界树

    [BZOJ3572][Hnoi2014]世界树 试题描述 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条 ...

  10. 51Nod 1250 排列与交换

    Description 统计 \(1...n\) 的排列,恰好进行 \(k\) 次相邻交换和至多进行 \(k\) 次交换生成的不同的序列个数. Sol DP. 好妙的题啊... 首先看第一个问题. 对 ...