齐次坐标
简介
说到图形的几何变换,就离不开“齐次坐标”这个神奇的东西,所谓“齐次坐标”,就是将一个原本n
维的向量用一个n+1
维的向量来表示。比如向量: ( x 1 , x 2 , . . . , x n ) (x_1, x_2, ..., x_n) (x1,x2,...,xn) 的齐次坐标可表示为: ( h x 1 , h x 2 , . . . , h x n , h ) (hx_1, hx_2, ..., hx_n, h) (hx1,hx2,...,hxn,h)。
其中h
是一个实数。显然一个向量的齐次坐标的表示是不唯一的,齐次坐标中的h
取不同的值都表示的是同一个点,例如齐次坐标[8, 4, 2], [4, 2, 1]
表示的都是二维点(2, 1)
。
优势
- “齐次坐标”提供了用矩阵运算把二维、三维甚至更高维空间中的一个点集从一个坐标变换到另一个坐标系的有效方法;
- 其次还可以表示无穷远的点,
n+1
维的“齐次坐标”中如果h=0
,实际上就表示了n
维空间的一个无穷远的点。对于“齐次坐标”[a, b, h]
,保持a
和b
不变,h -> 0
的过程就表示了二维坐标系中的一个点沿着直线ax + by = 0
逐渐走向无穷远处的过程。
解释一下:在笛卡尔坐标中无穷远处的点表示为
(∞, ∞)
,而一个实数除以0
是趋向于∞
的,所以在“齐次坐标”中(1/h, 2/h, h )
当h -> 0
时,齐次坐标表示的点也趋向于无穷。
二维图形的几何变换
图形的几何变换主要包括:平移、缩放、旋转三种最基本的变换形式;其中有比较特殊的如对称变换、错切变换、复合变换等。下面将会对以上的变换方式进行逐一的介绍。
在介绍之前要先说一下“二维齐次坐标变换”的矩阵形式:
[ a b ∣ c d e ∣ f − − ∣ − g h ∣ i ] \begin{bmatrix} a & b & | & c \\ d & e & | & f \\ - & - & | & - \\ g & h & | & i \end{bmatrix} ⎣⎢⎢⎡ad−gbe−h∣∣∣∣cf−i⎦⎥⎥⎤
将矩阵分为4部分,第一部分[a, b, d, e]
可以控制图形的缩放、旋转、对称和错切的变换;[c, f]
是对图形进行平移变换;[g, h]
是对图形作投影变换;[i]
则是控制图形整体的缩放变换。
以下几何变换都会采用齐次坐标进行运算。
平移变换
平移变换是将坐标的[x, y]
进行加法运算,平移由[c, f]
进行控制:
[ x ′ y ′ 1 ] = [ 1 , 0 , t x 0 , 1 , t y 0 , 0 , 1 ] [ x y 1 ] = [ x + t x , y + t y , 1 ] = T ( t x , t y ) [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} 1, 0, t_x \\ 0, 1, t_y \\ 0, 0, 1 \end{bmatrix}\begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} x + t_x, \\ y + t_y, \\ 1 \end{bmatrix} = T(t_x, t_y)\begin{bmatrix} x \\ y \\ 1 \end{bmatrix} ⎣⎡x′y′1⎦⎤=⎣⎡1,0,tx0,1,ty0,0,1⎦⎤⎣⎡xy1⎦⎤=⎣⎡x+tx,y+ty,1⎦⎤=T(tx,ty)⎣⎡xy1⎦⎤
如图:
缩放变换
缩放变换是对坐标进行一定比例的缩放,由[a, b, d, e]
控制:
[ x ′ y ′ 1 ] = [ s x , 0 , 0 0 , s y , 0 0 , 0 , 1 ] [ x y 1 ] = [ s x ∗ x s y ∗ y 1 ] = S ( s x , s y ) [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} =\begin{bmatrix} s_x, 0, 0 \\ 0, s_y, 0 \\ 0, 0, 1 \end{bmatrix}\begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} s_x * x \\ s_y * y \\ 1 \end{bmatrix} = S(s_x, s_y)\begin{bmatrix} x \\ y \\ 1 \end{bmatrix} ⎣⎡x′y′1⎦⎤=⎣⎡sx,0,00,sy,00,0,1⎦⎤⎣⎡xy1⎦⎤=⎣⎡sx∗xsy∗y1⎦⎤=S(sx,sy)⎣⎡xy1⎦⎤
如图:
旋转变换
在直角坐标平面中,将二维图形绕原点旋转θ
角的变换形式如下:
[ x ′ y ′ 1 ] = [ c o s θ , − s i n θ , 0 s i n θ , c o s θ , 0 0 , 0 , 1 ] [ x y 1 ] = [ x c o s θ − y s i n θ x s i n θ + y c o s θ 1 ] = R ( θ ) [ x y