NYOJ 298-点的变换(经典矩阵解决点平移、缩放、翻转和旋转)
题目地址:NYOJ 298
思路:该题假设用对每一个点模拟的操作。时间复杂度为O(n+m),结果肯定超时。然而利用矩阵乘法能够在O(m)的时间内把全部的操作合并为一个矩阵,然后每一个点与该矩阵相乘能够得出终于的位置。
PS:十个利用矩阵乘法解决的经典题目 超级具体。
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
const int maxn=1e5+10;
struct node {
double mp[5][5];
} q[maxn],res,init,ans;
struct node Mul(struct node x,struct node y) {
struct node tmp;
int i,j,k;
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
tmp.mp[i][j]=0;
for(k=0; k<3; k++)
tmp.mp[i][j]=tmp.mp[i][j]+x.mp[i][k]*y.mp[k][j];
}
}
return tmp;
}
int main() {
int n,m,i,j;
double a,b,bs,jd,hd;
while(~scanf("%d %d",&n,&m)) {
for(i=0; i<n; i++) {
scanf("%lf %lf",&q[i].mp[0][0],&q[i].mp[1][0]);
q[i].mp[2][0]=1;
}
for(i=0; i<3; i++) {
ans.mp[i][i]=1;
}
char str[10];
while(m--) {
memset(str,0,sizeof(str));
memset(res.mp,0,sizeof(res.mp));
scanf("%s",str);
for(i=0; i<3; i++)
res.mp[i][i]=1;
if(str[0]=='M') {
scanf("%lf %lf",&a,&b);
res.mp[0][2]=a;
res.mp[1][2]=b;
} else if(str[0]=='X') {
res.mp[1][1]=-1;
} else if(str[0]=='Y') {
res.mp[0][0]=-1;
} else if(str[0]=='S') {
scanf("%lf",&bs);
res.mp[0][0]=bs;
res.mp[1][1]=bs;
} else if(str[0]=='R') {
scanf("%lf",&jd);
hd=jd/180*pi;
res.mp[0][0]=cos(hd);
res.mp[0][1]=-sin(hd);
res.mp[1][0]=sin(hd);
res.mp[1][1]=cos(hd);
}
ans=Mul(res,ans);
}
for(i=0; i<n; i++) {
init=Mul(ans,q[i]);
printf("%.1lf %.1lf\n",init.mp[0][0],init.mp[1][0]);
} }
return 0;
}
NYOJ 298-点的变换(经典矩阵解决点平移、缩放、翻转和旋转)的更多相关文章
- NYOJ 298 点的变换
题目链接:298 点的变换 这题放在矩阵快速幂里,我一开始想不透它是怎么和矩阵搭上边的,然后写了个暴力的果然超时,上网看了题解后,发现竟然能够构造一些精巧的矩阵来处理,不得不说实在太强大了! http ...
- NYOJ 298 点的变换 矩阵乘法
http://acm.nyist.net/JudgeOnline/problem.php?pid=298 最好还是自己手推一下矩阵式子..不算太难..但是有一些小知识.... 首先当然是矩阵的细节.. ...
- NYOJ298 点的变换 【矩阵乘法经典】
任意门:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=298 点的变换 时间限制:2000 ms | 内存限制:65535 KB 难度:5 ...
- NYOJ 298
利用矩阵来做变换,参考Max大神的思想的,虽然不是同一道题. ----------- 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置.操作有平移.缩放.翻转和旋转 这里的操 ...
- Python入门经典. 以解决计算问题为导向的Python编程实践
Python入门经典. 以解决计算问题为导向的Python编程实践(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1juLsew8UiOErRheQPOuTaw 提取 ...
- OpenCV计算机视觉学习(11)——图像空间几何变换(图像缩放,图像旋转,图像翻转,图像平移,仿射变换,镜像变换)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 图像 ...
- WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示
原文:WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示 为方便描述, 这里仅以正方形来做演示, 其他图形从略. 运行时效果图:XAML代码:// Transform.XAML< ...
- opencv2 矩阵方式 resize图像缩放代码(转载)
http://blog.sina.com.cn/s/blog_74a459380101r0yx.html opencv2 矩阵方式 resize图像缩放代码(转载) (2014-05-16 09:55 ...
- 解决Delphi窗体缩放の疑难杂症
http://anony3721.blog.163.com/blog/static/511974201082235754423/ 解决Delphi窗体缩放の疑难杂症 2010-09-22 15:57: ...
随机推荐
- docker 入门学习
一 : docker 安装(linux-centos7) 安装docker要求 1.docker只支持在64位cup架构计算机上运行,目前不支持32位cup. 2.建议系统的linux内核版本在3.1 ...
- idea文件全部变红, 文件全部红色
idea如果当前project用了版本控制器,其下面新建的所有的项目默认都是加入到版本控制里面,所以项目名称和文件都是红色的,如图: 看起来非常不爽, 那么如何解决呢? File–>Settin ...
- mysql group_concat函数详解
group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator '分隔符'] ) 1. --以id分组,把price字 ...
- java自动机器人自动生成修姓名工具类
public class GenerateName { public static String getName() { Random random = new Random(); String[] ...
- vue 封装自定义组件
组件结构 sjld >index.js >sjid.vue 最好单独放一个文件夹,有依赖的话装依赖 Sjld.vue 内容 <template id="sjld" ...
- 笔试算法题(04):实现 string & memcpy & strcpy & strlen
出题:请实现给定String的类定义: 分析:注意检查标准类构造注意事项: 解题: #include <stdio.h> #include <string.h> /** * 检 ...
- [Python3网络爬虫开发实战] 3.1.2-处理异常
前一节我们了解了请求的发送过程,但是在网络不好的情况下,如果出现了异常,该怎么办呢?这时如果不处理这些异常,程序很可能因报错而终止运行,所以异常处理还是十分有必要的. urllib的error模块定义 ...
- Nginx出现403 forbidden (13: Permission denied)报错的四种原因
一.由于php-fpm启动用户和nginx工作用户不一致所致 php-fpm启动用户配置位置 nginx工作用户配置位置 二.不存在在文件,可能是文件路径有误,可以查看nginx错误日志来判断 三.缺 ...
- MYSQL有那些优化?
版权声明:本文为博主转载文章,原博主地址: https://blog.csdn.net/u013087513/article/details/77899412 MySQL优化三大方向 ① 优化MySQ ...
- LeetCode(4)Median of Two Sorted Arrays
题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...