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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

三维空间中的几何变换-平移旋转缩放

深入学习了下图形几何变换,主要是绕任意轴旋转部分(其他的已有一定基础),现记录学习笔记。...
  • swety_gxy
  • swety_gxy
  • 2017年06月12日 13:16
  • 2063

矩阵运算——平移,旋转,缩放

平时开发程序,免不了要对图像做各种变换处理。有的时候变换可能比较复杂,比如平移之后又旋转,旋转之后又平移,又缩放。 直接用公式计算,不但复杂,而且效率低下。这时可以借助变换矩阵和矩阵乘法,将多个...
  • leaf6094189
  • leaf6094189
  • 2014年01月20日 15:02
  • 41215

二维图形学的变换-平移、旋转、缩放 OpenGL

这里实现的是多点画多边形,然后把这个多边形进行二维的变换。 首先,多点画多边形,为了方便起见,我直接调用了Opengl的库函数。其次,就是如何进行多边形的二维变换。在这里我有两种方法。第一种是直接根据...
  • a3631568
  • a3631568
  • 2016年12月14日 13:34
  • 3725

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

介绍 坐标变换矩阵是一个3*3的矩阵,用来对图形进行坐标变化,将原来的坐标点转移到新的坐标点,因为一个图片是有点阵和每一点上的颜色信息组成的,所以对坐标的变换,就是对每一点进行搬移形成新的图片。具体的...
  • Jarlen
  • Jarlen
  • 2015年04月04日 23:02
  • 9952

编写一个基于OpenGL的程序,绘制一个三角形,并分别绘制这个三角形经旋转、平移、缩放后的结果

编写一个基于OpenGL的程序,绘制一个三角形,并分别绘制这个三角形经旋转、平移、缩放后的结果 主要用到的有三个函数: 1、Translatef(); 用于图形平移 2、glRotatef();...
  • heda_zjs
  • heda_zjs
  • 2017年03月28日 15:55
  • 913

pcl 学习2 利用矩阵转移一个点云

点云处理中,我们有可能需要将点云旋转或者平移到某个位置。pcl提供了相应的函数。假如转移矩阵是[R|T],那么目标点dst和原始点src的关系是: dst=[R|t]*src. 转移矩阵的格式是...
  • u013351270
  • u013351270
  • 2017年04月01日 11:16
  • 1112

矩阵变换:沿任意方向缩放、镜像、正交投影及切变及其推导

镜像、正交投影和切变的推导都可根据缩放变形而来。在要缩放方向上去缩放因子k,如果|k|1,物体“膨胀”;k=0,正交投影;k 1. 缩放 01. 沿坐标轴缩放 2D中有两个缩放因子Kx和Ky,...
  • zsq306650083
  • zsq306650083
  • 2013年04月09日 10:18
  • 8440

图像处理中的旋转、平移、缩放——仿射变换的原理和优化

仿射变换的原理在条形码识别软件中有图像预览的功能。有时预览的图像需要进行转置(旋转180度或者90度)、缩放、镜像(左右反转)等操作。OpenCV提供了相应的函数进行以上操作。例如: 转置:cv::...
  • bytekiller
  • bytekiller
  • 2015年08月20日 10:08
  • 3683

OpenGL坐标变换 平移,缩放与旋转

OpenGL坐标变换 平移,缩放与旋转 OpenGL有内建的坐标系,事实上OpenGl有两套坐标系,一个坐标系被称为眼睛坐标(eye coordinate system) 简称ECS ,上章讲的就...
  • arag2009
  • arag2009
  • 2017年04月13日 15:35
  • 640

坐标系之间的旋转平移变换与对应变换矩阵的关系

在摄影测量和计算机视觉中,经常会遇到空间坐标系之间的坐标转换问题,而两个坐标系之间的变换关系一般可以通过一个旋转矩阵R和一个平移向量T(或C)描述。因此,理解清楚坐标系之间旋转平移的转换过程与对应变换...
  • u010096745
  • u010096745
  • 2015年08月09日 20:32
  • 2430
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NYOJ 298-点的变换(经典矩阵解决点平移、缩放、翻转和旋转)
举报原因:
原因补充:

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