nyoj--298 点的变换(矩阵)
来源:互联网 发布:vm linux 共享文件夹 编辑:程序博客网 时间:2024/06/05 19:39
nyoj 298
题解
参阅Matrix67大神的十个利用矩阵乘法解决的经典题目
#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <algorithm>#include <cmath>using namespace std;const int maxn = 10000 + 10;const double pi = acos(-1.0);struct point{ double x, y; };point p[maxn];int n, m;struct mat{ double M[3][3]; mat(){ memset(M, 0, sizeof(M)); }};mat mul(mat& A, mat& B){ mat C; for(int i = 0; i < 3; ++i) for(int j = 0; j < 3; ++j) for(int k = 0; k < 3; ++k) C.M[i][j] += A.M[i][k] * B.M[k][j]; return C;}// translationvoid M(mat& A, double x, double y){ mat E; E.M[0][0] = 1, E.M[0][1] = 0, E.M[0][2] = x; E.M[1][0] = 0, E.M[1][1] = 1, E.M[1][2] = y; E.M[2][0] = 0, E.M[2][1] = 0, E.M[2][2] = 1; A = mul(E, A);}// up and downvoid X(mat& A){ mat E; E.M[0][0] = 1, E.M[0][1] = 0, E.M[0][2] = 0; E.M[1][0] = 0, E.M[1][1] = -1, E.M[1][2] = 0; E.M[2][0] = 0, E.M[2][1] = 0, E.M[2][2] = 1; A = mul(E, A);}// left and rightvoid Y(mat& A){ mat E; E.M[0][0] = -1, E.M[0][1] = 0, E.M[0][2] = 0; E.M[1][0] = 0, E.M[1][1] = 1, E.M[1][2] = 0; E.M[2][0] = 0, E.M[2][1] = 0, E.M[2][2] = 1; A = mul(E, A);}// magnify p timesvoid S(mat& A, double p){ mat E; E.M[0][0] = p, E.M[0][1] = 0, E.M[0][2] = 0; E.M[1][0] = 0, E.M[1][1] = p, E.M[1][2] = 0; E.M[2][0] = 0, E.M[2][1] = 0, E.M[2][2] = 1; A = mul(E, A);}// rotate counterclockwisevoid R(mat& A, double angle){ mat E; double radian = angle * pi / 180; E.M[0][0] = cos(radian), E.M[0][1] = -sin(radian), E.M[0][2] = 0; E.M[1][0] = sin(radian), E.M[1][1] = cos(radian), E.M[1][2] = 0; E.M[2][0] = 0, E.M[2][1] = 0, E.M[2][2] = 1; A = mul(E, A);}int main(){ //freopen("data.in", "r", stdin); cin >> n >> m; for(int i = 0; i < n; ++i) scanf("%lf %lf", &p[i].x, &p[i].y); char op; double x, y; mat A; for(int i = 0; i < 3; ++i) A.M[i][i] = 1; while(m--) { cin >> op; if(op == 'X') X(A); if(op == 'Y') Y(A); if(op == 'M'){ scanf("%lf %lf", &x, &y); M(A, x, y); } if(op == 'S'){ scanf("%lf", &x); S(A, x); } if(op == 'R'){ scanf("%lf", &x); R(A, x); } } for(int i = 0; i < n; ++i) { mat B; B.M[0][0] = p[i].x, B.M[1][0] = p[i].y, B.M[2][0] = 1; B = mul(A, B); printf("%.1f %.1f\n", B.M[0][0], B.M[1][0]); } return 0;}
0 0
- nyoj--298 点的变换(矩阵)
- NYOJ 298 点的变换 (矩阵快速幂)
- NYOJ 298 点的变换(矩阵快速幂)
- nyoj ACM:点的变换(矩阵运算)
- NYOJ 298 点的变换
- nyoj 298 点的变换
- NYOJ 298-点的变换(经典矩阵解决点平移、缩放、翻转和旋转)
- NYOJ 题目298 点的变换(数学,矩阵相乘,模板经典)
- n个点m个操作后各点的位置 矩阵快速幂 NYOJ 298 点的变换
- Nyoj 298 点的变换[利用矩阵求解坐标点的转换,平移,绕原点旋转,沿x,y轴翻转]
- 矩阵十题【一】点的变换
- 点的变换(矩阵转化)
- 仿射变换(给定一组三个点前和后的变换,获得变换矩阵)
- NYOJ298 点的变换(经典矩阵应用)
- OpenGL的变换矩阵
- 矩阵的坐标变换
- 矩阵的空间变换
- 矩阵的初等变换
- 113. Path Sum II
- jni 调用sock_raw -- 端口扫描
- python扩展之爬虫基础
- event 对象
- skynet 源码分析
- nyoj--298 点的变换(矩阵)
- 人工智能各种技术与算法
- linux 编辑器之神 vim使用
- [精]详解SSH端口转发,本地端口转发、远程端口转发、动态端口转发
- python网络爬虫入门(三)———多线程
- C++第二次实验-2
- 选择排序--SelectSort
- #if 0 的作用
- LeetCode004----Median of Two Sorted Arrays