点的变换
来源:互联网 发布:期货自动交易编程 编辑:程序博客网 时间: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;}
阅读全文
0 0
- 点的变换
- NYOJ 298 点的变换
- nyoj 298 点的变换
- 点的变换和法向量的变换
- 矩阵十题【一】点的变换
- 点的变换(矩阵转化)
- nyoj--298 点的变换(矩阵)
- 对三维点集的归一化变换
- opencv中仿射变换的注意点
- 点云的刚性变换[微记]
- nyoj ACM:点的变换(矩阵运算)
- 仿射变换(给定一组三个点前和后的变换,获得变换矩阵)
- 注册点变换
- 坐标点旋转变换
- OpenGL: 变换观察点
- 如何根据坐标架进行点的坐标变换
- 相对任一参考点的二维几何变换
- NYOJ 298 点的变换 (矩阵快速幂)
- C++ auto_ptr智能指针的用法
- JavaScript 【某宝某东 360 度 3D 旋转展示商品主图实现】
- Java中Synchronized的用法
- Java序列化高级
- php+redis+TP处理并发
- 点的变换
- win10安装多个版本的jdk
- animate.css的使用,css特效
- 解决在eclipse中建本地server运行项目所遇到中文乱码的问题
- linux下配置多tomcat
- shell判断变量是否为空
- 详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别
- Scrapy框架抓取豆瓣电影的小爬虫学习日记(三)
- tomcat 6 el表达式报错的问题