整理一篇学习笔记,把看到的一些要点和自己的理解都记下来。
这篇文章涉及知识点
预备知识
正交矩阵:n阶矩阵A,
A
A
T
=
E
,
A
T
AA^T=E,A^T
AAT=E,AT是转置矩阵。1=|E|=
∣
A
∣
∣
A
T
∣
→
∣
A
∣
=
±
1
|A||A^T| \to |A|= \pm 1
∣A∣∣AT∣→∣A∣=±1。
留意:行列式为1的矩阵,不一定是正交矩阵,如错切(剪切)矩阵。
行列式
≠
±
1
\neq \pm 1
=±1的矩阵B,
旋转对应的矩阵:
{
cos
θ
−
sin
θ
sin
θ
cos
θ
}
\begin{Bmatrix}\cos\theta & -\sin \theta \\ \sin\theta& \cos\theta \end{Bmatrix}
{cosθsinθ−sinθcosθ}
反射对应的矩阵:
{
cos
2
θ
s
i
n
2
θ
sin
2
θ
−
cos
2
θ
}
\begin{Bmatrix}\cos2\theta &sin 2\theta \\ \sin2\theta& -\cos2\theta \end{Bmatrix}
{cos2θsin2θsin2θ−cos2θ}
错切矩阵:
{
1
k
0
1
}
即
x
′
=
x
+
k
y
,
y
′
=
y
\begin{Bmatrix}1& k \\ 0&1 \end{Bmatrix}即x'=x+ky,y'=y
{10k1}即x′=x+ky,y′=y
缩放
{
k
x
0
0
k
y
}
\begin{Bmatrix}kx & 0 \\ 0&ky \end{Bmatrix}
{kx00ky}
2阶正交矩阵和旋转反射
显然旋转矩阵和反射矩阵是正交矩阵。
正交矩阵A=
{
a
b
c
d
}
\begin{Bmatrix}a &b \\ c & d\end{Bmatrix}
{acbd}根据正交的定义:
{
a
b
c
d
}
×
{
a
c
b
d
}
=
{
a
2
+
b
2
a
c
+
b
d
a
c
+
b
d
c
2
+
d
2
}
\begin{Bmatrix}a &b \\ c & d\end{Bmatrix} \times \begin{Bmatrix}a &c \\b & d\end{Bmatrix}=\begin{Bmatrix}a^2+b^2 &ac+bd \\ ac+bd & c^2+d^2\end{Bmatrix}
{acbd}×{abcd}={a2+b2ac+bdac+bdc2+d2}
即
a
2
+
b
2
=
c
2
+
d
2
=
1
,
a
c
+
b
d
=
0
a^2+b^2=c^2+d^2=1,ac+bd=0
a2+b2=c2+d2=1,ac+bd=0(1)
旋转矩阵一定是正交矩阵
cos
2
θ
+
(
−
sin
θ
)
2
=
1
sin
2
θ
+
cos
2
θ
=
1
cos
θ
sin
θ
+
(
−
sin
θ
cos
θ
)
=
0
\cos^2 \theta+(-\sin \theta)^2=1 \\ \sin^2\theta+\cos^2\theta=1\\ \cos\theta\sin\theta+(-\sin \theta \cos \theta)=0
cos2θ+(−sinθ)2=1sin2θ+cos2θ=1cosθsinθ+(−sinθcosθ)=0
反射矩阵一定是正交矩阵
cos
2
2
θ
+
sin
2
2
θ
=
1
sin
2
2
θ
+
(
−
cos
2
θ
)
2
=
1
cos
2
θ
sin
2
θ
+
(
sin
2
θ
−
cos
2
θ
)
=
0
\cos^2 2\theta+\sin^2 2\theta=1 \\ \sin^2 2\theta+(-\cos 2\theta)^2=1\\ \cos 2\theta \sin 2\theta+(\sin 2\theta - \cos 2\theta)=0\\
cos22θ+sin22θ=1sin22θ+(−cos2θ)2=1cos2θsin2θ+(sin2θ−cos2θ)=0
正交矩阵一定是旋转矩阵或反射矩阵
令
a
=
sin
α
,
c
=
sin
β
,
则
a=\sin \alpha,c=\sin\beta,则
a=sinα,c=sinβ,则
sin
α
sin
β
+
cos
α
cos
β
=
0
\sin \alpha \sin\beta+\cos \alpha\cos \beta=0
sinαsinβ+cosαcosβ=0
根据余弦差公式 cos(α−β)=cosαcosβ+sinαsinβ ,得
α
=
β
±
90
∘
\alpha=\beta \pm 90^\circ
α=β±90∘
如果
β
=
α
+
90
∘
\beta= \alpha+ 90^\circ
β=α+90∘
A
=
{
sin
α
c
o
s
α
sin
(
α
+
90
)
cos
(
α
+
90
)
}
=
{
sin
α
cos
α
cos
α
−
sin
α
}
A=\begin{Bmatrix}\sin \alpha & cos \alpha \\ \sin(\alpha+90) &\cos(\alpha+90)\end{Bmatrix}=\begin{Bmatrix}\sin \alpha & \cos \alpha \\ \cos \alpha &-\sin \alpha\end{Bmatrix}
A={sinαsin(α+90)cosαcos(α+90)}={sinαcosαcosα−sinα}
用
cos
2
θ
替换
sin
α
,
sin
2
θ
替换
cos
α
用\cos 2\theta 替换\sin \alpha,\sin 2\theta替换\cos \alpha
用cos2θ替换sinα,sin2θ替换cosα后,便是反射。
如果
β
=
α
−
90
∘
\beta= \alpha - 90^\circ
β=α−90∘
则
c
=
sin
(
α
−
90
)
=
−
cos
α
,
d
=
cos
(
a
l
p
h
a
−
90
)
=
sin
α
c=\sin(\alpha-90)=-\cos \alpha,d=\cos(alpha-90)=\sin \alpha
c=sin(α−90)=−cosα,d=cos(alpha−90)=sinα
即:
A
=
{
sin
α
cos
α
−
cos
α
sin
α
}
A=\begin{Bmatrix}\sin \alpha & \cos \alpha \\ -\cos \alpha &\sin \alpha\end{Bmatrix}
A={sinα−cosαcosαsinα}
令
α
=
θ
+
90
A
=
{
cos
θ
−
sin
θ
sin
θ
cos
θ
}
\alpha = \theta + 90 A=\begin{Bmatrix}\cos \theta & -\sin\theta \\ \sin \theta & \cos \theta \end{Bmatrix}
α=θ+90A={cosθsinθ−sinθcosθ} 就是旋转。
有限个正交矩阵相乘仍然是正交矩阵,故一个正交矩阵可以表示有限次旋转和反射。
齐次矩阵与平移
令A是二阶正交矩阵,
B
=
{
0
0
}
,
C
=
{
e
f
}
,
D
=
{
A
B
C
1
}
,
E
=
{
x
,
y
}
B =\begin{Bmatrix}0&0 \end{Bmatrix} ,C =\begin{Bmatrix}e \\ f \end{Bmatrix} ,D= \begin{Bmatrix}A&B\\C&1 \end{Bmatrix},E=\begin{Bmatrix}x,y\end{Bmatrix}
B={00},C={ef},D={ACB1},E={x,y} 则
{
E
′
F
}
=
{
E
1
}
×
D
\begin{Bmatrix}E' &F\end{Bmatrix}=\begin{Bmatrix}E &1\end{Bmatrix} \times D
{E′F}={E1}×D
E
′
=
E
A
+
C
,
F
=
1
E'=EA+C,F=1
E′=EA+C,F=1即E’=E乘以正交矩阵,再加上平移。即齐次矩阵支持旋转反射和平移。C可以表示有限次平移。
故齐次矩阵可以表示任意有限次旋转、反射、平移。
F必须恒为1,否则相同的C平移量不同。
留意:齐次矩阵不是3阶正交矩阵。
齐次矩阵可以拆分两个矩阵相乘,B是零矩阵用0表示:
D
=
{
A
0
0
1
}
×
=
{
1
0
C
1
}
D=\begin{Bmatrix}A&0\\0&1 \end{Bmatrix} \times=\begin{Bmatrix} 1&0 \\C & 1 \end{Bmatrix}
D={A001}×={1C01}
任意仿射操作都存在等效操作,第一步缩放最后一步平移
如果不是后面不是平移则交换
2阶矩阵A代表其它操作,v代表平移,P表示原始点,P’表示变换后的点。
P’=PA+v
(P+v)A-vA+v= PA+v。
即交换顺序后补偿一个v-vA。
先错切缩放反射是缩放的前一操作则交换两者顺序并增加一个平移
A是任意二阶矩阵,B是二阶缩放矩阵。
A
B
=
{
a
b
c
d
}
{
s
x
0
0
s
y
}
=
{
a
s
x
b
s
y
c
s
x
d
s
y
}
AB=\begin{Bmatrix}a&b\\c&d\end{Bmatrix}\begin{Bmatrix}s_x&0\\0&s_y\end{Bmatrix}=\begin{Bmatrix}as_x&bs_y\\cs_x&ds_y\end{Bmatrix}
AB={acbd}{sx00sy}={asxcsxbsydsy}
B
A
=
{
s
x
0
0
s
y
}
{
a
b
c
d
}
=
{
s
x
a
s
x
b
s
y
c
s
y
d
}
BA=\begin{Bmatrix}s_x&0\\0&s_y\end{Bmatrix}\begin{Bmatrix}a&b\\c&d\end{Bmatrix}=\begin{Bmatrix}s_xa&s_xb\\s_yc&s_yd\end{Bmatrix}
BA={sx00sy}{acbd}={sxasycsxbsyd}
则 AB=BA+
{
0
,
b
s
y
−
b
s
x
c
s
x
−
c
s
y
0
}
\begin{Bmatrix}0,&bs_y-bs_x\\cs_x-cs_y&0\end{Bmatrix}
{0,csx−csybsy−bsx0}
总结
通过操作后,缩放在最前面,平移子最最后面。两个缩放可以合并成一个缩放,故顶多只有一个缩放,在最前面;两个平移可以合并成一个平移,故顶多一个平移,在最后面。
反射和错切解析成旋转缩放,那么整个操作就只有缩放旋转平移,按上述操作移动操作顺序后,最多三步:缩放旋转平移。
工程场景通常是均匀缩放,且缩放倍数为正。
典型应用:自来水管是否完全相同,数学描述两条折线能否通过旋转平移重合。连通无环图,枚举第二棵树的叶子Left2和第一个棵树的第一个叶子节点Leaf1是否对应。令两者的相邻的端点分别为N2,N1。则
v
1
=
L
e
a
f
2
N
2
⃗
和
v
1
=
L
e
a
f
1
N
1
⃗
的夹角就是旋转角度
v1=\vec{Leaf2N2}和v1=\vec{Leaf1N1}的夹角就是旋转角度
v1=Leaf2N2
和v1=Leaf1N1
的夹角就是旋转角度,
L
e
f
t
1
L
e
f
t
2
⃗
\vec{Left1 Left2}
Left1Left2
就是平移的向量。
如果容许均匀缩放,则缩放系数是
∣
v
1
∣
∣
v
2
∣
\frac{ |v1|}{|v2|}
∣v2∣∣v1∣
展望
下面的知识点,过于复杂,需要学习专门课程。
任意可逆矩阵2阶方阵都可以分解成
A
=
R
(
θ
)
.
S
.
H
,
R
(
θ
)
是旋转矩阵,
S
:对角缩放矩阵,
H
:
错切矩阵
(
上三角、下三角
)
A=R(\theta).S.H,R(\theta)是旋转矩阵,S:对角缩放矩阵,H:错切矩阵(上三角、下三角)
A=R(θ).S.H,R(θ)是旋转矩阵,S:对角缩放矩阵,H:错切矩阵(上三角、下三角)通过QR分解或极分解。
QR 分解 《数值线性代数》 / 《矩阵计算》 也是《线性代数》的进阶内容
极分解 《矩阵论》 / 《高等代数》 的专题 也是《数值线性代数》中矩阵分解的一部分
错切矩阵可以通过“旋转 + 非均匀缩放 + 反向旋转”精确表示。
反射矩阵可以通过“旋转 + 非均匀缩放 + 反向旋转”精确表示。
扩展阅读
算法为骨,CAD为魂亲士工具箱:支持中望CAD2024、AutoCad2013及以上,多年承接CAD工程的精华开发中遇到的麻烦,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》《数学》。学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作活到老,学到老。明朝中后期,大约50%的进士能当上堂官(副部及更高);能当上堂官的举人只有十余人。子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
视频课程
先学简单的课程,请移步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++实现。
这篇笔记就先到这里,后面用到新的思路或者发现有问题再补充。
评论 (0)
暂无评论