【计算几何】仿射变换与齐次矩阵

本文涉及知识点

数学

计算几何

X ′ = A X + t X'=AX+t X′=AX+t,其中A是 2 × 2 2 \times 2 2×2矩阵,表示线性变换;X是 ( x , y ) T (x,y)^T (x,y)T;t是 ( d x , d x ) T ,表示平移 (dx,dx)^T,表示平移 (dx,dx)T,表示平移。

变换组成

任意放射变换都可以拆分成:旋转缩放反射错切平移。

旋转矩阵
( cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ) \begin{pmatrix} \cos\theta & -\sin \theta \\ \sin \theta & \cos \theta \\ \end{pmatrix} (cosθsinθ−sinθcosθ)

主对角线是余弦,副对角线是正弦。右上是负数,其它全部是正。

缩放矩阵
( k x 0 0 k y ) \begin{pmatrix} k_x & 0 \\ 0 & k_y\\ \end{pmatrix} (kx00ky)
X ′ = k x × x , Y ′ = k y × y X'=k_x\times x ,Y'=k_y \times y X′=kx×x,Y′=ky×y。

反射(镜像对称)矩阵

以x轴对称为例,x不变,y乘以-1。
( 1 0 0 − 1 ) \begin{pmatrix} 1 & 0 \\ 0 & -1\\ \end{pmatrix} (100−1)

错切矩阵

以横切为例。
( 1 k 0 1 ) \begin{pmatrix} 1 & k \\ 0 & 1\\ \end{pmatrix} (10k1)
x ′ = x + k × y x'=x+k\times y x′=x+k×y,不变。

平移向量
{ d x , d y } T \{dx,dy\}^T {dx,dy}T

齐次矩阵

进行多次矩阵操作,可以对矩阵相乘,得到统一矩阵。如:D是数据矩阵,M系列是操作矩阵。

右乘: D M 1 M 2 ⋯ M n = D ( M 1 M 2 ⋯ M n ) DM_1M_2\cdots M_n=D(M_1M_2\cdots M_n) DM1M2⋯Mn=D(M1M2⋯Mn)

左乘: M n ( ⋯ M 2 ( M 1 D ) ) = ( M n ⋯ M 2 M 1 ) M_n(\cdots M_2(M_1 D))=(M_n \cdots M_2 M_1) Mn(⋯M2(M1D))=(Mn⋯M2M1)

上述5种操作统一成 3 × 3 3 \times 3 3×3矩阵(齐次矩阵)就可以用矩阵连乘。
( A 11 A 12 d x A 21 A 22 d y 0 0 1 ) \begin{pmatrix} A11& A12 & dx \\ A21 & A22 & dy \\ 0& 0& 1\\ \end{pmatrix} A11A210A12A220dxdy1

X={x,y,1},X'={x',y',1}

仿射变换性质

性质一 :保距性,任意两点距离不变。旋转反射平移符合,缩放错切不符合。
性质二 :保向性, 通俗的说两个向量AB,A到B变换前后,都是顺时针或逆时针。旋转平移错切符合,反射不符合。负缩放可能不符合。
性质三 :旋转平移反射横切面积不变,缩放面积发生变化。
性质四 :所有仿射变化都保持直线性,平行性。平移旋转和反射容易理解。下面讨论缩放和横切。

缩放:

x'= k x × x k_x \times x kx×x,y'= k y × y , k x ≠ 0 , k y ≠ 0 k_y \times y,k_x \neq 0,k_y \neq 0 ky×y,kx=0,ky=0

其一般形式为:ax+by+c=0 即 ( a ÷ k x ) x ′ + ( b ÷ k y ) y ′ + c = 0 (a\div k_x)x'+(b\div k_y)y'+c=0 (a÷kx)x′+(b÷ky)y′+c=0

变换后,仍然是直线。直线的法向量由(a,b)变成 ( a ÷ k x , b ÷ k y ) (a\div k_x,b \div k_y) (a÷kx,b÷ky)

错切(横切为例):

只讨论所有纵坐标为y1的点,任意边界两点(x1,y1),(x2,y1)变换后为: ( x 1 + k × y 1 ) , ( x 2 + k × y 1 ) (x1+k \times y1),(x2+ k \times y1) (x1+k×y1),(x2+k×y1),两者的距离没变,即面积未变。

d(x+ky)+ey+f=0 即:dx+(e+dk)y+f=0。d=a,e+ak=b,即e=b-ak。

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
员工说:技术至上,老板不信;投资人的代表说:技术至上,老板会信。
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开发环境: VS2022 C++17

如无特殊说明,本算法 用**C++**实现。

相关推荐
chen_ever2 小时前
Protobuf详解(从安装到实战)
c++·rpc·信息与通信
liuyao_xianhui2 小时前
0~n-1中缺失的数字_优选算法(二分查找)
算法
hmbbcsm2 小时前
python做题小记(八)
开发语言·c++·算法
机器学习之心2 小时前
基于Stacking集成学习算法的数据回归预测(4种基学习器PLS、SVM、BP、RF,元学习器LSBoost)MATLAB代码
算法·回归·集成学习·stacking集成学习
图像生成小菜鸟2 小时前
Score Based diffusion model 数学推导
算法·机器学习·概率论
再睡一夏就好2 小时前
深入Linux线程:从轻量级进程到双TCB架构
linux·运维·服务器·c++·学习·架构·线程
声声codeGrandMaster3 小时前
AI之模型提升
人工智能·pytorch·python·算法·ai
黄金小码农3 小时前
工具坐标系
算法
特立独行的猫a3 小时前
C++开发中的Pimpl机制与类声明机制深度解析:现代C++的编译解耦艺术
开发语言·c++·pimpl