nyoj 298 点的变换
来源:互联网 发布:淘宝网限制购买商品 编辑:程序博客网 时间:2024/05/20 05:59
题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=298
对所有的操作,我们可以用一个矩阵储存起来,一系列的操作,我们可以利用矩阵相乘,来储存!
平移:
关于x轴对称:
关于y轴对称:
缩放:
旋转:
例如按上述顺序操作(先平移,再关于x轴对称,再关于y轴对称,然后再缩放,最后在旋转)则可以表示为:
同样道理,这题 利用这种思路可已解决问题
#include <iostream>#include <cstring>#include <cstdio>#include <cmath>using namespace std;#define PI acos(-1.0)const int MAXN = 10010;struct Node{ double x, y;}iPoint[MAXN];struct Matrix{ double iMatrix[3][3];};Matrix Multi_Mattrix(Matrix a, Matrix b){ Matrix c; int i, j, k; for(i = 0; i < 3; ++i) { for(j = 0; j < 3; ++j) { c.iMatrix[i][j] = 0; for(k = 0; k < 3; ++k) c.iMatrix[i][j] += a.iMatrix[i][k] * b.iMatrix[k][j]; } } return c;}int main(){ int n, m, i; Matrix iMove, iXSymmetry, iYSymmetry, iEnlarge, iRotate; scanf("%d%d", &n, &m); for(i = 0; i < n; ++i) scanf("%lf%lf", &iPoint[i].x, &iPoint[i].y); memset(iMove.iMatrix, 0, sizeof(iMove.iMatrix));//平移 memset(iXSymmetry.iMatrix, 0, sizeof(iXSymmetry.iMatrix));//关于x轴对称 memset(iYSymmetry.iMatrix, 0, sizeof(iYSymmetry.iMatrix));//关于y轴对称 memset(iEnlarge.iMatrix, 0, sizeof(iEnlarge.iMatrix));//缩放 memset(iRotate.iMatrix, 0, sizeof(iRotate.iMatrix));//旋转 iMove.iMatrix[0][0] = iMove.iMatrix[1][1] = iMove.iMatrix[2][2] = 1; iXSymmetry.iMatrix[0][0] = iXSymmetry.iMatrix[2][2] = 1; iXSymmetry.iMatrix[1][1] = -1; iYSymmetry.iMatrix[1][1] = iYSymmetry.iMatrix[2][2] = 1; iYSymmetry.iMatrix[0][0] = -1; iEnlarge.iMatrix[2][2] = iRotate.iMatrix[2][2] = 1; Matrix tmp; memset(tmp.iMatrix, 0, sizeof(tmp.iMatrix)); tmp.iMatrix[0][0] = tmp.iMatrix[1][1] = tmp.iMatrix[2][2] = 1; char c; double x, y; while(m--) { getchar(); scanf("%c", &c); switch(c) { case 'M': scanf("%lf %lf", &x, &y); iMove.iMatrix[0][2] = x; iMove.iMatrix[1][2] = y; tmp = Multi_Mattrix(iMove, tmp); break ; case 'X': tmp = Multi_Mattrix(iXSymmetry, tmp); break ; case 'Y': tmp = Multi_Mattrix(iYSymmetry, tmp); break ; case 'S': scanf("%lf", &x); iEnlarge.iMatrix[0][0] = iEnlarge.iMatrix[1][1] = x; tmp = Multi_Mattrix(iEnlarge, tmp); break ; case 'R': scanf("%lf", &x); y = x/180 * PI; iRotate.iMatrix[0][0] = iRotate.iMatrix[1][1] = cos(y); iRotate.iMatrix[0][1] = -sin(y); iRotate.iMatrix[1][0] = sin(y); tmp = Multi_Mattrix(iRotate, tmp); break ; default: break ; } } Matrix res; for(i = 0; i < n; ++i) { memset(res.iMatrix, 0, sizeof(res.iMatrix)); res.iMatrix[0][0] = iPoint[i].x; res.iMatrix[1][0] = iPoint[i].y; res.iMatrix[2][0] = 1; res = Multi_Mattrix(tmp, res); printf("%.1lf %.1lf\n", res.iMatrix[0][0], res.iMatrix[1][0]); } return 0;}
0 0
- NYOJ 298 点的变换
- nyoj 298 点的变换
- nyoj--298 点的变换(矩阵)
- NYOJ 298 点的变换 (矩阵快速幂)
- NYOJ 298 点的变换(矩阵快速幂)
- nyoj ACM:点的变换(矩阵运算)
- NYOJ 298-点的变换(经典矩阵解决点平移、缩放、翻转和旋转)
- NYOJ 题目298 点的变换(数学,矩阵相乘,模板经典)
- n个点m个操作后各点的位置 矩阵快速幂 NYOJ 298 点的变换
- Nyoj 298 点的变换[利用矩阵求解坐标点的转换,平移,绕原点旋转,沿x,y轴翻转]
- 点的变换
- 点的变换和法向量的变换
- 矩阵十题【一】点的变换
- 点的变换(矩阵转化)
- 对三维点集的归一化变换
- opencv中仿射变换的注意点
- 点云的刚性变换[微记]
- nyoj 找点 酒馆浪人的博客
- Monitor
- oracle的timestamp类型数据转换成yyyymmddhhmi24格式
- 安卓学习140501:组件——Activities与Intents
- 用OpenSceneGraph实现的NeHe OpenGL教程 - 第二十二课
- 算法的时间复杂度和空间复杂度(1)
- nyoj 298 点的变换
- Zstack之例程GenericApp分析笔记2
- VirtualBox的四种网络连接方式
- A + B Problem Too 2101
- Unix环境高级编程:1-2 基础知识、标准化
- connect-mongo使用简介
- UVA - 120 - Stacks of Flapjacks
- 几篇网文利用Block回调,ASIHTTPRequest 实现登录验证
- 我的学习之路—String源码分析