本文涉及知识点
计算几何
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++**实现。
