2D 计算机图形学基础速建——2

2D计算机图形学------线性代数基础(基于3b1b)

前言

​ 笔者查看的是3b1b大佬的课程,觉得非常优秀------算是把抽象的线性代数给化简了,变得非常的直观,这里把笔记整理一份,备忘用。

A. 向量与线性组合 --- "箭头与拼图"

​ 向量就是从原点出发的箭头。把它们线性组合就是用标量放缩再加在一起------把空间"拼"出来。所以,我们发现一些向量可以被一些更加基础的向量合成出来。比如说,我们在一个2D的XY笛卡尔坐标系下,利用(0, 1)和(1, 0)就可以把其他所有的二维向量全部表达,这两个向量就成为了线性独立的基向量。这也是为什么2D向量是2D的,因为两个线性无关的向量就可以表达这个空间下的所有向量了。

B. 矩阵 = 线性变换 --- "把空间扭一扭"

矩阵不是"表格",而是把每个向量映射到另一个向量的规则(把整个平面一次性扭曲)。可看成把基向量变换成新的向量列。笔者非常喜欢3b1b将矩阵解释为对基向量的变换集合。

这个思路很简单,A主题中我们早就说过了------任何坐标系下的所有向量都可以表达为基向量的某种线性组合,所以任何对某一个向量的变换,都可以由对基向量施加变换后在依照新的基向量按照之前线性组合的方式生成这一过程描述。

利用带数学公式的说明,对v⃗=ax⃗+by⃗\vec{v} = a\vec{x} + b\vec{y}v =ax +by 施加以M矩阵,即尝试做v′⃗=Mv⃗\vec{v'} = M \vec{v}v′ =Mv ,实际上都可以被写作v′⃗=a(Mx⃗+My⃗)=a(x′⃗+y′⃗)\vec{v'} = a(M\vec{x} +M\vec{y}) = a(\vec{x'} + \vec{y'})v′ =a(Mx +My )=a(x′ +y′ ),这也就是说明,M矩阵无非就是表达对坐标系的变换。

因此,把矩阵看作是一个运算符函数,比看作是一个数更加的准确。矩阵的乘法就是函数的复合,很显然,我们没办法说明复合映射算子f{g(x)}f\{g(x)\}f{g(x)}同看起来相似但其实完全不是一回事情的复合映射算子g{f(x)}g\{f(x)\}g{f(x)}等价

C. 线性方程、解空间 --- "几何求交"

线性方程组的每一个方程都在描述一个几何体,无非是说明到底是直线,平面还是其他任何集合体而已,将这个图形集合起来(联合为方程组),无非就是求解他们的交。所以对于线性方程:无解 = 直线/平面没有交点;无穷解 = 有一族交集(自由度),唯一解 = 精确交点(可逆矩阵)。

D. 行列式 --- "有向面积/体积缩放"

det(A) 告诉你变换 A 把单位面积放大/缩小了多少(并带有符号代表是否翻转)。所以,当det(A)成为0,说明这是一个不可逆的变换,因为任何一个空间经过A矩阵的作用都会丧失原先的信息,反过来看,我们也就没办法将变化后的结果还原。实数乘法就能说明:0乘以任何数都是0,那反过来,0除以0可以是任何数,也就没有意义了------你说什么都是对的。因为逆向操作总是成立。

E. 逆矩阵与可逆性 --- "可撤销的变换"

逆矩阵就是一个可以撤销(存在逆操作的)变化的反变化,也就是施加M矩阵后的v′⃗\vec{v'}v′ 想要还原回来就必须施加一个M−1M^{-1}M−1出来,注意作用是从右向左的:v⃗=M−1v′⃗=M−1Mv⃗=v⃗\vec{v} = M^{-1}\vec{v'} = M^{-1}M\vec{v} = \vec{v}v =M−1v′ =M−1Mv =v 。换而言之,M−1M^{-1}M−1可以撤销先前MMM矩阵的影响。前提是它可以M是撤销的,这就要求我们的det ≠ 0

F. 特征向量 / 特征值 --- "不变方向"

这个比较有意思,他说明的是------在M矩阵施加对坐标系的线性变化中,居然会有向量只是纯粹的拉伸而不会改变方便。我们立马就能说:这些向量是特征向量 ,他们的伸缩因子就是特征值

为此,我们如何把这些向量找出来呢?很简单,我们按照他想要的求解方程:Mv⃗=λv⃗M\vec{v} = \lambda \vec{v}Mv =λv 就好了,其中λ可以是负(方向翻转)或复数(2D 旋转对应复特征)。所以我们发现,特征向量可以把复杂变换分解为沿若干独立方向的伸缩(对角化就是把矩阵表成对角形式)。

相关推荐
序属秋秋秋13 小时前
《Linux系统编程之进程基础》【进程优先级】
linux·运维·c语言·c++·笔记·进程·优先级
Nan_Shu_61415 小时前
学习:ES6(2)
前端·学习·es6
河铃旅鹿17 小时前
Android开发-java版:Framgent
android·java·笔记·学习
自动化代码美学19 小时前
【Python3.13】官网学习之控制流
开发语言·windows·python·学习
AA陈超20 小时前
ASC学习笔记0020:用于定义角色或Actor的默认属性值
c++·笔记·学习·ue5·虚幻引擎
IMPYLH21 小时前
Lua 的 collectgarbage 函数
开发语言·笔记·junit·单元测试·lua
檐下翻书17321 小时前
从入门到精通:流程图制作学习路径规划
论文阅读·人工智能·学习·算法·流程图·论文笔记
SalvoGao21 小时前
Python学习 | 怎么理解epoch?
数据结构·人工智能·python·深度学习·学习
思成不止于此1 天前
深入理解 C++ 多态:从概念到实现的完整解析
开发语言·c++·笔记·学习·多态·c++40周年
Highcharts.js1 天前
学习 Highcharts 可视化开发的有效途径
学习·数据可视化·highcharts·图表开发·可视化开发