NYOJ 298-点的变换(经典矩阵解决点平移、缩放、翻转和旋转)

原创 2015年07月10日 17:24:48

题目地址: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 点的变换[利用矩阵求解坐标点的转换,平移,绕原点旋转,沿x,y轴翻转]

题目链接:acm.nyist.net/JudgeOnline/problem.php?pid=298 题目的意思就是给你一n 点()

图像处理---关于像素坐标矩阵变换(平移,旋转,缩放,错切)

转载于: http://blog.csdn.net/jarlen/article/details/44877961 图像处理缩放变换旋转矩阵 介绍 坐标变换矩阵是一个3*3的矩...

opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移

常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标。 仿射变换...

NYOJ 298 点的变换(矩阵快速幂)

点的变换 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 平面上有不超过10000个点,坐标都是已知的,现在可能对所有的点做以下几种操作: 平移一定距离(M...

nyoj--298 点的变换(矩阵)

nyoj 298题解参阅Matrix67大神的十个利用矩阵乘法解决的经典题目#include #include #include #include #include #include us...

NYOJ 298 点的变换 (矩阵快速幂)

题目链接:  http://acm.nyist.net/JudgeOnline/problem.php?pid=298 题目: 点的变换 时间限制:2000 ms  |   ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)