图形学各种二维基础变换,原来线性代数还能这么用,太牛了

news2024/9/28 21:29:51

缩放变换

均匀缩放

  • 若想将一个图形缩小0.5倍

    image-20240708152453401

  • 若x乘上缩放值s等于x撇,y同理,则 x ′ = s x y ′ = s y \begin{aligned} & x^{\prime}=s x \\ & y^{\prime}=s y \end{aligned} x=sxy=sy,这样就表示了x缩小了s倍,y也是

  • 将其转为矩阵操作则是在前面乘上一个缩放矩阵 [ x ′ y ′ ] = [ s 0 0 s ] [ x y ] \left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{ll} s & 0 \\ 0 & s \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right] [xy]=[s00s][xy],根据矩阵乘法性质,其中的x撇和y撇最后乘出来就是上述的sx和sy。

  • 变换矩阵为 [ s 0 0 s ] \left[\begin{array}{ll} s & 0 \\ 0 & s \end{array}\right] [s00s]

非均匀缩放

  • x缩放0.5倍,y不变

image-20240708152837988

  • 和上述公式一样,只不过将对角矩阵的下面那个换一下就行 [ x ′ y ′ ] = [ s x 0 0 s y ] [ x y ] \left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{cc} s_x & 0 \\ 0 & s_y \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right] [xy]=[sx00sy][xy]
  • 其中sx为x轴的缩放倍数,sy为y轴。
  • 变换矩阵为 [ s x 0 0 s y ] \left[\begin{array}{cc} s_x & 0 \\ 0 & s_y \end{array}\right] [sx00sy]

镜像变换

  • 若要将x沿x轴镜像,则表达为 x ′ = − x y ′ = y \begin{aligned} & x^{\prime}=-x \\ & y^{\prime}=y \end{aligned} x=xy=y

image-20240708153231564

  • 其矩阵形式则为 [ x ′ y ′ ] = [ − 1 0 0 1 ] [ x y ] \left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{cc} -1 & 0 \\ 0 & 1 \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right] [xy]=[1001][xy]
  • 变换矩阵为 [ − 1 0 0 1 ] \left[\begin{array}{cc} -1 & 0 \\ 0 & 1 \end{array}\right] [1001]

剪切变换

  • x轴拉长,y轴不变

image-20240708153745046

  • 当y=0时,水平方向不变
  • 当y=1时,水平方向向右移动a个位置
  • 于是可推出,当y为1/2时,则移动后的x应该在原本的x+ay处,也就是x根据变换后为x+ay,y不变
  • 用矩阵表达则为 [ x ′ y ′ ] = [ 1 a 0 1 ] [ x y ] \left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{ll} 1 & a \\ 0 & 1 \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right] [xy]=[10a1][xy]
  • 变换矩阵为 [ 1 a 0 1 ] \left[\begin{array}{ll} 1 & a \\ 0 & 1 \end{array}\right] [10a1]

旋转变换

  • 若无特殊说明,若说A旋转45度,则表示为A绕原点逆时针旋转45度

image-20240708154814971

  • 则旋转矩阵为 R θ = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] \mathbf{R}_\theta=\left[\begin{array}{cc} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{array}\right] Rθ=[cosθsinθsinθcosθ]
  • 也就是 [ x ′ y ′ ] = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] [ x y ] \left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{cc} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right] [xy]=[cosθsinθsinθcosθ][xy]
  • 变换矩阵为 [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] \left[\begin{array}{cc} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{array}\right] [cosθsinθsinθcosθ]

线性变换

  • 经过上述变换公式,可以发现其任意一个坐标都可以通过乘上一个系数变成另一个坐标,即 x ′ = a x + b y y ′ = c x + d y \begin{aligned} & x^{\prime}=a x+b y \\ & y^{\prime}=c x+d y \end{aligned} x=ax+byy=cx+dy
  • 矩阵形式就是 [ x ′ y ′ ] = [ a b c d ] [ x y ] \left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{ll} a & b \\ c & d \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right] [xy]=[acbd][xy],也可写成 x ′ = M x \mathbf{x}^{\prime}=\mathbf{M} \mathbf{x} x=Mx
  • 则将这种变换取名为线性变换

平移变换

  • x轴移动tx,y轴移动ty

image-20240708161311429

  • 则在坐标上的表达为 x ′ = x + t x y ′ = y + t y \begin{aligned} & x^{\prime}=x+t_x \\ & y^{\prime}=y+t_y \end{aligned} x=x+txy=y+ty
  • 可是这种加法操作,并不能转换为二维矩阵的矩阵变换,也就是乘上一个矩阵从而使得xy移动到x撇y撇
  • 只能通过矩阵的加法来实现,也就是 [ x ′ y ′ ] = [ a b c d ] [ x y ] + [ t x t y ] \left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{ll} a & b \\ c & d \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right]+\left[\begin{array}{l} t_x \\ t_y \end{array}\right] [xy]=[acbd][xy]+[txty],而这种形式的变换,被称为仿射变换
  • 若不想进行其他变换,也就是旋转啊、缩放啊等,则前面那个abcd矩阵设为单位矩阵

齐次坐标

  • 为了使得在进行平移变换的时候或者其他所有的变换都只用乘一个矩阵就完成变换,所以引入了齐次坐标
  • 也就是在原有维度的情况下添加了第三个坐标维度w,在原先是2d点的情况变为 ( x , y , 1 ) ⊤ (\mathbf{x}, \mathbf{y}, 1)^{\top} (x,y,1)
  • 原先是2d向量的情况现在变为 ( x , y , 0 ) ⊤ (\mathbf{x}, \mathbf{y}, 0)^{\top} (x,y,0)
  • 于是我们可以构建出一个矩阵,从而达成只乘一个矩阵就可完成平移变换 ( x ′ y ′ w ′ ) = ( 1 0 t x 0 1 t y 0 0 1 ) ⋅ ( x y 1 ) = ( x + t x y + t y 1 ) \left(\begin{array}{c} x^{\prime} \\ y^{\prime} \\ w^{\prime} \end{array}\right)=\left(\begin{array}{ccc} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{array}\right) \cdot\left(\begin{array}{l} x \\ y \\ 1 \end{array}\right)=\left(\begin{array}{c} x+t_x \\ y+t_y \\ 1 \end{array}\right) xyw = 100010txty1 xy1 = x+txy+ty1
  • 只看最右边的前两个值发现就是一个平移操作
  • 而为啥二维的点和二维的向量要区分开呢?也就是二维点增加的维度w为1,二维向量增加的维度w为0,主要是因为向量有一个性质,就是一个向量平移到了另一个位置,那它还是那个向量,并不会发生改变
  • 而看到上面的公式,若把矩阵右边乘上的向量里的1变为0,则乘完矩阵后的值还是(x, y, 0),这样才符合刚刚说的那个向量平移不变性的性质。
  • 同时,区分点和向量还有一个好处就是,向量加向量还是一个向量,例如两个向量相加,比如(x1, y1, 0) + (x2, y2, 0)后为(x1 + x2, y1 + y2, 0),这正好符合向量相加的原则
  • 并且当两个点相减的时候,可以理解为是从a点指向到了b点,那么这个a到b就是一个向量,也就是(x1, y1, 1) - (x2, y2, 1) = (x1 - x2, y1 - y2 , 0),这正好也符合两个点相减的意义
  • 同理可得一个点加上一个向量,就相当于该点移动了一个向量的位置到了另一个点,也就是(x1, y1, 1) + (x2, y2, 0) = (x1 + x2, y1 + y2, 1),这也正好表现为了一个点
  • 所以引入齐次坐标很方便
  • 而任何一个仿射变换都可以使用齐次坐标来转换为仅需乘上一个矩阵就可完成变换
  • ( x ′ y ′ ) = ( a b c d ) ⋅ ( x y ) + ( t x t y ) \binom{x^{\prime}}{y^{\prime}}=\left(\begin{array}{ll} a & b \\ c & d \end{array}\right) \cdot\binom{x}{y}+\binom{t_x}{t_y} (yx)=(acbd)(yx)+(tytx)可转换为 ( x ′ y ′ 1 ) = ( a b t x c d t y 0 0 1 ) ⋅ ( x y 1 ) \left(\begin{array}{l} x^{\prime} \\ y^{\prime} \\ 1 \end{array}\right)=\left(\begin{array}{llc} a & b & t_x \\ c & d & t_y \\ 0 & 0 & 1 \end{array}\right) \cdot\left(\begin{array}{l} x \\ y \\ 1 \end{array}\right) xy1 = ac0bd0txty1 xy1
  • 也就是现在处理任何一个变换,都可以仅乘一个矩阵就可以完成变换了
  • 而引入齐次坐标的上述所有变换矩阵,都可以用以下矩阵表示
  • 缩放变换: S ( s x , s y ) = ( s x 0 0 0 s y 0 0 0 1 ) \mathbf{S}\left(s_x, s_y\right)=\left(\begin{array}{ccc} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{array}\right) S(sx,sy)= sx000sy0001
  • 旋转变换: R ( α ) = ( cos ⁡ α − sin ⁡ α 0 sin ⁡ α cos ⁡ 4 α 0 0 0 1 ) \mathbf{R}(\alpha)=\left(\begin{array}{ccc} \cos \alpha & -\sin \alpha & 0 \\ \sin \alpha & \cos _4 \alpha & 0 \\ 0 & 0 & 1 \end{array}\right) R(α)= cosαsinα0sinαcos4α0001
  • 平移变换: T ( t x , t y ) = ( 1 0 t x 0 1 t y 0 0 1 ) \mathbf{T}\left(t_x, t_y\right)=\left(\begin{array}{ccc} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{array}\right) T(tx,ty)= 100010txty1
  • 可发现在二维仿射变换添加齐次坐标后的矩阵最后一行都是(0, 0, 1)。

逆变换

  • 若A点经过一个矩阵M变换成了B点,那么则B点经过一个矩阵 M − 1 M^{-1} M1可重新变换成A点,这个 M − 1 M^{-1} M1就是逆变换矩阵

    image-20240708165534391

变换矩阵的合并与分解

合并

  • 现在假设想将一个图形变换为另一个图形,如下图所示

image-20240708170417203

  • 则明显有一个方法,就是利用平移变换和旋转变换

  • 但是这里如果先利用平移再旋转,则会出现下图情况

    image-20240708170545289

  • 可以发现第一个图形并没有变换到我们想要的位置上

  • 而如果我们先旋转,再平移,则可以发现可以完美变换到我们想要的位置

    image-20240708170653389

  • 这说明变换的顺序是非常重要的,也就是 R 45 ⋅ T ( 1 , 0 ) ≠ T ( 1 , 0 ) ⋅ R 45 R_{45} \cdot T_{(1,0)} \neq T_{(1,0)} \cdot R_{45} R45T(1,0)=T(1,0)R45

  • 也就是我们要先将向量和旋转矩阵相乘,再进行平移变换,即 T ( 1 , 0 ) ⋅ R 45 [ x y 1 ] = [ 1 0 1 0 1 0 0 0 1 ] [ cos ⁡ 4 5 ∘ − sin ⁡ 4 5 ∘ 0 sin ⁡ 4 5 ∘ cos ⁡ 4 5 ∘ 0 0 0 1 ] [ x y 1 ] T_{(1,0)} \cdot R_{45}\left[\begin{array}{l} x \\ y \\ 1 \end{array}\right]=\left[\begin{array}{lll} 1 & 0 & 1 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{ccc} \cos 45^{\circ} & -\sin 45^{\circ} & 0 \\ \sin 45^{\circ} & \cos 45^{\circ} & 0 \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{l} x \\ y \\ 1 \end{array}\right] T(1,0)R45 xy1 = 100010101 cos45sin450sin45cos450001 xy1

  • 然后我们计算顺序则是要从右到左进行运算

  • 而又由于矩阵有结合律,也就是(A*B)*C = A*(B*C),那么我们可以先将前面几个变换矩阵先乘为一个矩阵,再用该矩阵去乘上向量,从而使得这个矩阵可以表示前面所有的变换操作,即 A n ( … A 2 ( A 1 ( x ) ) ) = A n ⋯ A 2 ⋅ A 1 ⋅ ( x y 1 ) A_n\left(\ldots A_2\left(A_1(\mathbf{x})\right)\right)=\mathbf{A}_n \cdots \mathbf{A}_2 \cdot \mathbf{A}_1 \cdot\left(\begin{array}{l} x \\ y \\ 1 \end{array}\right) An(A2(A1(x)))=AnA2A1 xy1

  • 因为这些变换矩阵都是3*3的,所以当他们乘完之后的最后的矩阵也肯定还是3*3的,也就是说最后乘完的这个矩阵可以表示出非常复杂的变换

分解

  • 一般情况下我们说旋转默认都是按照原点逆时针开始旋转,但是假设我现在想要按照当前图形的左下角进行旋转,应该怎么办呢。

  • 例如要将如下图像的最左侧图形变换到最右侧

    image-20240708210504934

  • 如果直接就旋转变换,由于旋转是默认对着原点旋转的,所以就很难变成最右边的图形,那么我们就可以将步骤分解,先把图形移动到原点,然后再旋转变换,再移动回原位即可。

  • 矩阵形式表达即 T ( c ) ⋅ R ( α ) ⋅ T ( − c ) \mathbf{T}(\mathbf{c}) \cdot \mathbf{R}(\alpha) \cdot \mathbf{T}(-\mathbf{c}) T(c)R(α)T(c)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1909124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UML中用例和用例图的概念

用例 用例模型的基本组成部分有用例、参与者(或角色)和系统。用例用于描述系统的功能,也就是从用户的角度来说,系统具体应包含哪些功能,从而帮助分析人员理解系统的行为。它是对系统功能的宏观的、整体的描述。一个完…

挑战杯 opencv python 深度学习垃圾图像分类系统

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 opencv python 深度学习垃圾分类系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 这是一个较为新颖的竞…

ubuntu 分区情况

ubuntu系统安装与分区指南 - Philbert - 博客园 (cnblogs.com)https://www.cnblogs.com/liangxuran/p/14872811.html 详解安装Ubuntu Linux系统时硬盘分区最合理的方法-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1711884

VScode免密链接ubuntu

Ubuntu 下载: sudo apt-get install openssh-serverps -e | grep sshd参考IP : ifconfig VScode配置 重新尝试连接,输入的密码是虚拟机用户密码 免密链接 Windows生成公钥 1、打开CMD 2、输入命令ssh-keygen 3、连续回车确认即可生成 …

矩阵式键盘最小需要多少个IO驱动

1. 概述 矩阵式键盘由于有其占用硬件资源少的优点有着极其广泛的应用,如PC键盘、电话按键、家用电器等等这类产品.矩阵键盘的基本原理如下所示(仅是原理示例,实际实现上还会为每个按键加上防倒流的二极管解决“鬼影”问题)&#x…

B端全局导航:左侧还是顶部?不是随随便便,有依据在。

一、什么是全局导航 B端系统的全局导航是指在B端系统中的主要导航菜单,它通常位于系统的顶部或左侧,提供了系统中各个模块和功能的入口。全局导航菜单可以帮助用户快速找到和访问系统中的各个功能模块,提高系统的可用性和用户体验。 全局导航…

【python】PyQt5可视化开发,鼠标键盘实现联动界面交互逻辑与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

稀疏建模介绍,详解机器学习知识

目录 一、什么是机器学习?二、稀疏建模介绍三、Lasso回归简介四、Lasso超参数调整与模型选择 一、什么是机器学习? 机器学习是一种人工智能技术,它使计算机系统能够从数据中学习并做出预测或决策,而无需明确编程。它涉及到使用算…

二叉树树的知识,选择➕编程

在一棵深度为7的完全二叉树中,可能有多少个结点?(1层深度为1,节点个数为1) 对于深度 d的完全二叉树: 完全二叉树中,前 d−1层是满的。 最后一层(第 d 层)可以不满&#x…

imazing电脑怎么下载 imazing怎么下载软件 使用iMazing下载和卸载Apple设备上的应用程序

iMazing官方版是一款管理苹果设备的软件,是一款帮助用户管理 iOS手机的PC端应用程序,能力远超 iTunes 提供的终极 iOS 设备管理器。在iMazing官方版上与苹果设备连接后,可以轻松传输文件,浏览保存信息等,功能比iTunes更…

【C++题解】1108 - 正整数N转换成一个二进制数

问题:1108 - 正整数N转换成一个二进制数 类型:进制转换 题目描述: 输入一个不大于 32767 的整数 n ,将它转换成一个二进制数。 输入: 输入只有一行,包括一个整数 (0 ≤ n ≤ 32767)。 输出…

Day1--每日一练

🍁 个人主页:爱编程的Tom💫 本篇博文收录专栏:每日一练-算法篇👉 目前其它专栏:c系列小游戏 c语言系列--万物的开始_ Java专栏等 🎉 欢迎 👍点赞✍评论⭐收藏&…

MacOS和Windows中怎么安装Redis

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 关注 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、MacOS中Redis的安装2.1 HomeBrew 安装(推荐)2.2 通过官方…

终于找到了免费的C盘清理软件(极智C盘清理)

搜了很久,终于让我找到了一款 完全免费的C盘清理软件(极智C盘清理)。 点击前往官网免费使用极智C盘清理软件: C盘清理 用户好评 完全免费的极智C盘清理 用极智C盘清理清理了下系统的临时文件、缓存等无用数据文件,C盘终…

PHP灵活用工任务小灵通微信小程序系统源码

💼灵活赚钱新风尚!灵活用工任务小灵通微信小程序,兼职自由两不误🚀 🔍 一、海量任务,随时随地接单赚外快 还在为找不到合适的兼职而烦恼吗?🤔 灵活用工任务小灵通微信小程序&#…

数字交流便携式电阻式三相负载组

三相型号选项范围从小型、便携式、低功耗单元到大功率、室内和室外永久电阻负载组。型号标配按钮式手动控制以及 PC 软件控制,为处理复杂的测试应用提供先进的负载曲线解决方案。这些装置适用于各种用途,包括测试发电机、UPS 系统、数据中心电源系统、电…

3D非遗刺绣作品数字化展厅身临其境地感受艺术的魅力与力量

走进3D艺术画展,一场颠覆传统的视觉盛宴即将上演。在这里,静态的观赏被赋予了全新的生命,观众将亲身体验到前所未有的参与性和互动性。 不同于传统的美术展览,3D艺术画展打破了旧有的观展形式,将艺术与科技完美结合&am…

前端画图引擎ZRender,echarts的渲染器,你知道吗?

Zrender是一个轻量级的Canvas和SVG渲染库,它提供了一个高性能的图形绘制和交互的解决方案,用于在Web页面上创建丰富的数据可视化和交互式图形。 可能大部分小伙伴不知道这个类库,本文给大家科普一下。 一、Zrender是谁? 该项目…

B端工作台如何设计?指导思想+布局建议+大厂案例全给你

一、B端工作台设计的指导思想 要做好B端工作台设计,以下是一些建议和策略: 1. 用户研究:深入了解目标用户的需求、行为和工作流程。通过用户研究方法,如用户访谈、观察和调研,收集用户反馈和意见,了解他们…