转载自: https://blog.csdn.net/yinhun2012/article/details/79544205

前面我们从理论上理解了图形学中图形的变换过程,具体可以理解为如果要对一个图形A进行变换,那么存在图形A所处的相同原点的仿射空间SpaceA(或者说仿射空间SpaceA中原点处存在一个图形A),这时候我们暂时忽略图形A,只考虑SpaceA经过各种变换最终变换成另一个仿射空间SpaceB(或者说变换后的仿射空间SpaceA与另一个仿射空间SpaceB重合),因为仿射空间SpaceA变换后可能被伸缩或者被旋转同时又移动了,那么仿射空间SpaceA中的图形A同时跟着被变换成了另外的样子,如下图:

想像一下,假设把你自己当作一个“图形”,这时候出现一个任务,就是让躺在床上的你从家里出发去公司坐在办公椅上上班写代码,你应该怎么做呢,首先你要起床(从平躺的向量变成竖着的向量,这就经历了一个人体旋转的过程),然后出发,经过一条长长的街道xxx路(从xxx路的起点路口到xxx路的终点路口,这就经历了一个人体平移的过程),然后拐弯进入yyy路并且继续行走(这就经历了人体旋转加人体平移两个过程),然后进入公司走到办公椅前坐下(从竖着站立状态变成坐下的坐立状态,这可以人为人体进行了形变缩放)。

这么一看,我们对于变换的理解就可以分解为旋转、平移、缩放三个过程。

前面我们对齐次坐标的理解,知道了旋转和缩放这两个过程可以通过矩阵T进行线性变换处理,但是平移却是需要将矩阵T扩充“平移维度”得到矩阵T'才能进行线性变换处理,所以数学上我们处理n维空间的图形变换就要使用n+1维齐次坐标以及n+1行n+1列矩阵来得到。接下来我们就来具体推导二维仿射坐标系下的旋转/平移/缩放。

1.矩阵操作仿射坐标系旋转,还是老办法,建立单位圆进行逆时针旋转θ角(三角函数中规定逆时针旋转为正角)的旋转矩阵辅助推导,如下图:

我们通过矩阵T_rotate旋转变换仿射坐标系xoy到x1oy1,矩阵T_rotate的推导也是通过建立线性方程组解方程得到T_rotate的未知数。那么仿射坐标系所“容纳”的原点图形也就跟着变换了。因为旋转变换不需要额外扩充成齐次坐标表示也能进行变换,所以我们忽略“平移维度”。

2.矩阵操作仿射坐标系缩放,建立辅助单位圆,如下图:

上面我们首先推导了标准缩放,也就是xy缩放比例K相同,接下来缩放比例不同x缩放m/y缩放n,依旧是通过建立矩阵T_scale以及转换成线性方程组就很容易得到矩阵T_scale了。

3.矩阵操作仿射坐标系平移,特殊情况来了!前面我们讲过仿射坐标系平移是不能直接进行线性变换的,而需要扩充平移维度进行辅助计算,如下图:

同样的,因为二维平移只有xy轴两个方向,我们建立仿射坐标系观察,同时扩充“平移维度”,建立矩阵T_translate和线性方程组,就能得到我们需要的平移矩阵T_translate。

前面我们推了二维情况下仿射坐标系旋转,缩放,平移的变换矩阵T_rotate,T_scale,T_translate,但是三个矩阵太不规范了,有的是2x2有的是3x3,有的使用了齐次坐标,有的又只使用了普通坐标,这对我们程序中进行计算是非常不友好的。之前我们说了平移变换是通过扩充“平移维度”来处理的,并不影响“旋转维度”和“缩放维度”,同时GPU设计的重要指标之一就是极快速处理4x4及以下的矩阵计算,所以我们通过将T_rotate和T_scale扩充维度到T_translate的行列数,用来统一传入GPU进行处理。

扩充方式如下图:

这里我们只需要将“平移维度”填入“旋转维度”和“缩放维度”就行了,如果不放心的话我们就验证一下扩充后的矩阵的计算结果,如下图:

缩放矩阵同理也可以计算出来结果。

这么一来我们就把旋转平移缩放的变换全部使用齐次坐标和3x3矩阵给统一化了,但是我们还是觉得麻烦,因为我处理一个图形变换居然还需要使用三个矩阵去分别计算,我们能不能直接把这三个矩阵通过什么方法变成一个呢,接下来我们来观察矩阵乘法的性质,继续由简入难。

假设我们有两个2x2的矩阵T1,T2来变换一个2x1的矩阵V(2x1的矩阵也就是一个二维向量),按照平常方法我们肯定就是先使用T1*V变换得到V1,然后再使用T2*V1变换得到V2,整个过程我们记为T2*(T1*V)。我们希望优化中间环节,尽量少的直接将V带入运算,希望变换成(T2*T1)*V,先将T2*T1得到矩阵T3,然后将T3*V变换得到V2,此时我们的问题就变成T2*T1得到的矩阵T3是否起到了T1、T2分别变换V相同的作用。

我们知道矩阵A*矩阵B的规则就是矩阵A的行m与矩阵B的列n的元素分别相乘再相加最终得到的元素放置于结果矩阵C的m行n列中,那么上面的问题矩阵T1*V得到的V1再使用T2*V1得到的结果和T2*T1得到T3*V的结果相同,因为这种矩阵乘法的计算规律在独立出每个行列计算后得到单个元素的分解式符合乘法分配律(c*(a+b) = c*a + c*b)运算然后拆分组合成另外的乘法分配律的组合体,这时候我们必须通过实际运算来观察,因为红色语言的描叙都过于复杂到无法直接心算,如下图:

最后的乘法分配组合经过分解拆分继续组合成乘法分配律组合体。

这时候我们可以将原本的旋转平移缩放三次矩阵操作T_rotate*(T_translate*(T_scale*Vector))变化成T_all(T_all = T_rotate*(T_translate*T_scale)) *Vector,保证Vector经过一个矩阵的一次变换达到目标。


http://www.taodudu.cc/news/show-5370406.html

相关文章:

  • Canvas图像的平移
  • 手机语音服务器在哪里设置,腾讯地图联合王者荣耀推出妲己语音导航服务(安装设置方法)...
  • Android调用高德地图app语音导航
  • 集成VR播放器--虚拟现实浪潮的一舟: UtoVR
  • GOOGLE VR SDK开发VR游戏,VR播放器之中的一个
  • Cloud VR论文解读
  • google vr 入门之制作简易的VR播放器(二)
  • Google VR Views实战(VR全景图播放器)
  • google vr 入门之制作简易的VR播放器(三),移动应用开发课程报告
  • google vr 入门之制作简易的VR播放器及去除界面控制按钮
  • google vr 入门之制作简易的VR播放器(三)
  • GOOGLE VR SDK开发VR游戏,VR播放器之一
  • IOS 基于ffmpeg VR播放器
  • VR播放器怎么做?
  • VR播放器
  • java计算机毕业设计古惠农产品线上销售系统源码+mysql数据库+系统+lw文档+部署
  • 计算机毕业设计ssm磐基建筑机械租赁有限公司机械租赁系统41c32系统+程序+源码+lw+远程部署
  • java毕业设计家政客户服务管理系统mybatis+源码+调试部署+系统+数据库+lw
  • 计算机毕业设计Java教务管理系统(源码+系统+mysql数据库+lw文档)
  • java计算机毕业设计衡师社团管理系统源程序+mysql+系统+lw文档+远程调试
  • java-net-php-python-jspm小区物业管理系统设计计算机毕业设计程序
  • 计算机毕业设计springboot基于大数据的疫情追踪系统的设计和实现rva1s源码+系统+程序+lw文档+部署
  • 计算机毕业设计JavaWEB儿童运动馆业务信息系统(源码+系统+mysql数据库+lw文档)
  • 双11剁手之家里有矿系列 90后居然是这么旅行的……
  • 30岁,银行工作,未婚女,考博OR考公务员?
  • 经典案例----磁盘容量获取错误
  • Bash(shellshock)
  • Shellshock_Attack
  • linux shell 鼠标事件,Bash Shellshock事件:CVE-2014-6271资料汇总
  • ctfhub-web进阶-shellshock(PHP学习)

线性代数:矩阵变换图形(二维平移缩放旋转)相关推荐

  1. 线性代数:矩阵变换图形(三维平移缩放旋转)

    紧接上一篇:http://blog.csdn.net/yinhun2012/article/details/79544205 这篇博文我只是准备对上一篇博文的内容进行扩展,因为上一篇我写完二维xy仿射 ...

  2. ITK:使用均方执行二维平移配准

    ITK:使用均方执行二维平移配准 内容提要 输出结果 C++实现代码 内容提要 本示例说明了Insight中图像注册框架的用法.应该将其读为ITK注册.该示例应作为对解决图像配准问题时通常涉及的元素的 ...

  3. 计算机图形学之二维平移旋转缩放代码

    以下均为MFC工程代码 代码一:简单实现 void CGeotranView::Onyuantu() {// 原图,画三角形CDC *pDC=GetDC();pDC->MoveTo(100,10 ...

  4. C语言计算机图形学平移代码,计算机图形学之二维平移旋转缩放代码

    以下均为MFC工程代码 代码一:简单实现 void CGeotranView::Onyuantu() { // 原图,画三角形 CDC *pDC=GetDC(); pDC->MoveTo(100 ...

  5. 二维平移旋转变换及其特性

    文章目录 平移矩阵 基本旋转矩阵(绕原点) 旋转矩阵(绕任意点) 刚体变换特性 平移矩阵 假设延x轴平移txt_xtx​,延y轴平移tyt_yty​距离,显然: x′=x+txx' = x + t_x ...

  6. 【飞控理论】【惯性导航基础】二维平面的旋转如何用代数表示?三维平面的旋转如何用代数表示?什么是四元数?四元数、欧拉角、方向余弦之间有什么关系?

    上一篇欧拉角 由于欧拉角在描述三维空间物体旋转问题时存在万向节死锁问题(详情戳这里),所以引入四元数概念. 目录 1.二维平面的旋转 2.三维平面的旋转(什么是四元数) 3.<捷联惯性导航> ...

  7. 二维平面直角坐标系内某一点绕另一点旋转【顺时针/逆时针】之后的坐标

    二维平面直角坐标系内,平面上一点(x1,y1)绕平面上另一点(x2,y2)逆时针旋转b角度,旋转后(x1,y1)对应的新坐标(x,y)计算如下: 同理, 二维平面直角坐标系内,平面上一点(x1,y1) ...

  8. [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  9. 关于二维平面坐标变换矩阵的说明

    坐标变换矩阵 什么是坐标变换矩阵 从平移的角度证明 从缩放的角度证明 从旋转的角度证明 从仿射关系证明(综合地看) 延伸:旋转矩阵的证明 什么是坐标变换矩阵 坐标转换矩阵就是指将两个点之间的仿射关系以 ...

最新文章

  1. go java web框架_java程序员10分钟可上手的golang框架golang实战使用gin+xorm搭建go语言web框架restgo...
  2. IT运维管理与ITIL
  3. 阿里巴巴对Java编程【Mysql】的规约
  4. QT控件出现乱码问题
  5. mysql怎么模拟死锁_mysql 模拟产生死锁
  6. Linux gtk开发教程,使用GTK+和Glade快速开发Linux图形界面
  7. jni实现回调java函数
  8. 警察抓小偷打字游戏JAVA_警察抓小偷打字游戏金山打字通游戏
  9. linux编译gdal geos,GDAL编译支持GEOS
  10. Windows设置redis开启自动启动
  11. python给csv文件添加表头
  12. php apache 假死,解决apache兼容性及慢或假死问题
  13. vue3警告[Vue warn]: Extraneous non-emits event listeners (getVal) were passed to component but could n
  14. VCS(DVE)仿真波形的存储和打开.vpd
  15. vue 使用vue-canvas-poster生成自定义海报
  16. 去IOE是什么意思?
  17. 《统计学习方法》学习笔记 第二十一章 PageRank算法
  18. 无刷直流电机自适应模糊PID控制及仿真
  19. 非常不错的学习网站——技术胖
  20. bzoj3436小K的农场

热门文章

  1. 南京林业大学2019c语言题库,2020年南京林业大学风景园林学院考研真题试卷及试题答案,C程序设计考研试题下载...
  2. Discuz的一处越权操作,强制回复无权限帖子
  3. 上午办离职,下午办入职,明天上班,马不停蹄。 --记2008年9月1日转职
  4. 为何你的情绪总被他人左右,ABC 情绪治疗法自救指南
  5. 遗传转化的基本知识(一)——基因转化的受体
  6. POJ 1734 Sightseeing trip(Floyd)
  7. 新手上路:ADAMS 基础知识讲解(图文并茂)【转载仿真论坛】(四)
  8. LeetCode 436. Find Right Interval
  9. Linux-hostname查看
  10. 旅游网站做朋友圈广告有哪些要点?