齐次坐标是用n+1维向量表示n维向量,例如点
P
(
x
,
y
)
的齐次化坐标为
(
w
x
,
w
y
,
w
)
,
w
为任意不为
0
的数
P(x,y)的齐次化坐标为(wx,wy,w),w为任意不为0的数
P(x,y)的齐次化坐标为(wx,wy,w),w为任意不为0的数如果w取值为1,则称为规范化的齐次坐标。
二维几何变换矩阵
由于二维点的齐次坐标是一个包含三个元素的列向量,那么二维几何变换矩阵就应该是一个3*3的方阵。
T
=
[
a
b
e
c
d
f
p
q
s
]
T=\begin{bmatrix} a&b&e\\ c&d&f\\ p&q&s \end{bmatrix}
T=
?acp?bdq?efs?
?
从功能上可以把二维变换矩阵分成四个子矩阵
T
0
=
[
a
b
c
d
]
T
1
=
[
e
f
]
T
2
=
[
p
q
]
T
3
=
[
s
]
T
0
对图形进行比例,旋转,反射和错切变换
,
T
1
进行平移变化,
T
2
进行投影变换
,
T
3
进行整体比例变换
T_0=\begin{bmatrix} a&b\\ c&d \end{bmatrix} T_1=\begin{bmatrix} e\\f\end{bmatrix} T_2=\begin{bmatrix} p&q\end{bmatrix} T_3=\begin{bmatrix} s\end{bmatrix}\\ T_0对图形进行比例,旋转,反射和错切变换,T_1进行平移变化,T_2进行投影变换,T_3进行整体比例变换
T0?=[ac?bd?]T1?=[ef?]T2?=[p?q?]T3?=[s?]T0?对图形进行比例,旋转,反射和错切变换,T1?进行平移变化,T2?进行投影变换,T3?进行整体比例变换
平移变换是图形上每一个点移动相同的坐标,假设有一点
P
(
x
,
y
)
移动到点
P
′
(
x
′
,
y
′
)
P(x,y)移动到点P^{\prime}(x^{\prime},y^{\prime})
P(x,y)移动到点P′(x′,y′)
{
x
′
=
x
+
T
x
y
′
=
y
+
T
y
(
T
x
,
T
y
是平移系数
)
\begin{cases} x^{\prime}=x+T_x\\ y^{\prime}=y+T_y \end{cases}(T_x,T_y是平移系数)
{x′=x+Tx?y′=y+Ty??(Tx?,Ty?是平移系数)
设二维平移变换矩阵为T
[
x
′
y
′
1
]
=
[
x
+
T
x
y
+
T
y
1
]
=
T
[
x
y
1
]
得到
T
=
[
1
0
T
x
0
1
T
y
0
0
1
]
\begin{bmatrix} x^{\prime}\\y^{\prime}\\1 \end{bmatrix}=\begin{bmatrix}x+T_x\\y+T_y\\1\end{bmatrix}=T\begin{bmatrix}x\\y\\1\end{bmatrix}得到T=\begin{bmatrix}1&0&T_x\\0&1&T_y\\0&0&1\end{bmatrix}
?x′y′1?
?=
?x+Tx?y+Ty?1?
?=T
?xy1?
?得到T=
?100?010?Tx?Ty?1?
?
P
(
x
,
y
)
相对于原点,沿
x
轴方向缩放
S
x
倍,沿
Y
轴方向缩放
S
y
倍到点
P
′
(
x
′
,
y
′
)
P(x,y)相对于原点,沿x轴方向缩放S_x倍,沿Y轴方向缩放S_y倍到点P_{\prime}(x^{\prime},y^{\prime})
P(x,y)相对于原点,沿x轴方向缩放Sx?倍,沿Y轴方向缩放Sy?倍到点P′?(x′,y′)
设二维变换矩阵为T
[
x
′
y
′
1
]
=
[
x
T
x
y
T
y
1
]
=
T
[
x
y
1
]
得到
T
=
[
T
x
0
0
0
T
y
0
0
0
1
]
\begin{bmatrix} x^{\prime}\\y^{\prime}\\1 \end{bmatrix}=\begin{bmatrix}xT_x\\yT_y\\1\end{bmatrix}=T\begin{bmatrix}x\\y\\1\end{bmatrix}得到T=\begin{bmatrix}T_x&0&0\\0&T_y&0\\0&0&1\end{bmatrix}
?x′y′1?
?=
?xTx?yTy?1?
?=T
?xy1?
?得到T=
?Tx?00?0Ty?0?001?
?
更一般的情况,
P
相对于点
(
p
x
,
p
y
)
进行比例变换到
P
′
P相对于点(p_x,p_y)进行比例变换到P^{\prime}
P相对于点(px?,py?)进行比例变换到P′。有
{
x
′
=
S
x
(
x
?
p
x
)
+
p
x
y
′
=
S
y
(
y
?
p
y
)
+
p
y
\begin{cases} x^{\prime}=S_x(x-p_x)+p_x\\ y^{\prime}=S_y(y-p_y)+p_y \end{cases}
{x′=Sx?(x?px?)+px?y′=Sy?(y?py?)+py??
此时的二维变换矩阵T为
T
=
[
S
x
0
p
x
(
1
?
S
x
)
0
S
y
p
y
(
1
?
S
y
)
0
0
1
]
\\T=\begin{bmatrix} S_x&0&p_x(1-S_x)\\ 0&S_y&p_y(1-S_y)\\ 0&0&1 \end{bmatrix}
T=
?Sx?00?0Sy?0?px?(1?Sx?)py?(1?Sy?)1?
?
点P相对于坐标原点旋转一个角度
β
\beta
β得到点
P
′
P^{\prime}
P′。
对点P,用极坐标可以表示成
{
x
=
r
cos
?
α
y
=
r
sin
?
α
\begin{cases} x=r \cos\alpha\\y=r \sin\alpha \end{cases}
{x=rcosαy=rsinα?
旋转后点
P
′
P^{\prime}
P′,用极坐标表示为
{
x
′
=
r
cos
?
(
α
+
β
)
=
r
cos
?
α
cos
?
β
?
r
sin
?
α
sin
?
β
=
x
cos
?
β
?
y
sin
?
β
y
′
=
r
sin
?
(
α
+
β
)
=
r
sin
?
α
cos
?
β
+
r
cos
?
α
sin
?
β
=
y
cos
?
β
+
x
sin
?
β
\begin{cases} x^{\prime}=r\cos(\alpha+\beta)=r\cos\alpha\cos\beta-r\sin\alpha\sin\beta=x\cos\beta-y\sin\beta \\y^{\prime}=r\sin(\alpha+\beta)=r\sin\alpha\cos\beta+r\cos\alpha\sin\beta=y\cos\beta+x\sin\beta \end{cases}
{x′=rcos(α+β)=rcosαcosβ?rsinαsinβ=xcosβ?ysinβy′=rsin(α+β)=rsinαcosβ+rcosαsinβ=ycosβ+xsinβ?
由此可以得到二维变换矩阵T
T
=
[
cos
?
β
?
sin
?
β
0
sin
?
β
cos
?
β
0
0
0
1
]
T=\begin{bmatrix} \cos\beta&-\sin\beta&0\\ \sin\beta&\cos\beta&0\\ 0&0&1 \end{bmatrix}
T=
?cosβsinβ0??sinβcosβ0?001?
?
更一般的情况,点P绕点
(
p
x
,
p
y
)
(p_x,p_y)
(px?,py?)旋转角度
β
\beta
β
{
x
′
=
(
x
?
p
x
)
cos
?
β
?
(
y
?
p
y
)
sin
?
β
+
p
x
y
′
=
(
x
?
p
x
)
sin
?
β
+
(
y
?
p
y
)
cos
?
β
+
p
y
\begin{cases} x^{\prime}=(x-p_x)\cos\beta-(y-p_y)\sin\beta+p_x\\ y^{\prime}=(x-p_x)\sin\beta+(y-p_y)\cos\beta+p_y \end{cases}
{x′=(x?px?)cosβ?(y?py?)sinβ+px?y′=(x?px?)sinβ+(y?py?)cosβ+py??
此时的二维变换矩阵T为
T
=
[
cos
?
β
?
sin
?
β
p
x
(
1
?
cos
?
β
)
+
p
y
sin
?
β
sin
?
β
cos
?
β
p
y
(
1
?
cos
?
β
)
?
p
x
sin
?
β
0
0
1
]
T=\begin{bmatrix} \cos\beta&-\sin\beta&p_x(1-\cos\beta)+p_y\sin\beta\\ \sin\beta&\cos\beta&p_y(1-\cos\beta)-p_x\sin\beta\\ 0&0&1 \end{bmatrix}
T=
?cosβsinβ0??sinβcosβ0?px?(1?cosβ)+py?sinβpy?(1?cosβ)?px?sinβ1?
?
关于原点对称,二维变换矩阵T
T
=
[
?
1
0
0
0
?
1
0
0
0
1
]
T=\begin{bmatrix} -1&0&0\\ 0&-1&0\\ 0&0&1 \end{bmatrix}
T=
??100?0?10?001?
?
关于x轴对称,二维变换矩阵T
T
=
[
1
0
0
0
?
1
0
0
0
1
]
T=\begin{bmatrix} 1&0&0\\ 0&-1&0\\ 0&0&1 \end{bmatrix}
T=
?100?0?10?001?
?
关于轴对称,二维变换矩阵T
T
=
[
?
1
0
0
0
1
0
0
0
1
]
T=\begin{bmatrix} -1&0&0\\ 0&1&0\\ 0&0&1 \end{bmatrix}
T=
??100?010?001?
?
关于点
(
p
x
,
p
y
)
(p_x,p_y)
(px?,py?)对称的二维变换矩阵T
T
=
[
?
1
0
2
p
x
0
?
1
2
p
y
0
0
1
]
T=\begin{bmatrix} -1&0&2p_x\\ 0&-1&2p_y\\ 0&0&1 \end{bmatrix}
T=
??100?0?10?2px?2py?1?
?
错切是点P相对于x,y轴进行不等量变化的过程。
相对于原点进行错切变换
{
x
′
=
x
+
λ
x
y
y
′
=
λ
y
x
+
y
\begin{cases} x^{\prime}=x+\lambda _x y\\y^{\prime}=\lambda _yx+y \end{cases}
{x′=x+λx?yy′=λy?x+y?
二维变换矩阵T为
T
=
[
1
λ
x
0
λ
y
1
0
0
0
1
]
T=\begin{bmatrix} 1&\lambda _x&0\\ \lambda _y&1&0\\ 0&0&1 \end{bmatrix}
T=
?1λy?0?λx?10?001?
?
相对于点
(
p
x
,
p
y
)
(p_x,p_y)
(px?,py?)进行错切变换
{
x
′
=
x
+
λ
x
(
y
?
p
x
)
y
′
=
λ
y
(
x
?
p
y
)
+
y
\begin{cases} x^{\prime}=x+\lambda _x (y-p_x)\\y^{\prime}=\lambda _y(x-p_y)+y \end{cases}
{x′=x+λx?(y?px?)y′=λy?(x?py?)+y?
二维变换矩阵T为
T
=
[
1
λ
x
?
λ
x
p
x
λ
y
1
?
λ
y
p
y
0
0
1
]
T=\begin{bmatrix} 1&\lambda _x&-\lambda _xp_x\\ \lambda _y&1&-\lambda _yp_y\\ 0&0&1 \end{bmatrix}
T=
?1λy?0?λx?10??λx?px??λy?py?1?
?