日期:2024年3月14日标签:Computer Graphics

仿射变换:从矩阵公式到几何性质 #

在计算机图形学,经常会遇到“仿射变换”这个概念。

平移、旋转、缩放、错切和反射,都可以统一写成仿射变换。更重要的是,仿射变换能够保持直线、平行关系、中点和重心等几何性质。

我将从二维仿射变换的基本公式出发,推导它的主要性质,并说明 B 样条曲线为什么具有仿射不变性。


1. 仿射变换的定义 #

二维平面中的仿射变换通常写成:

[x y]=============[ab cd][x y]+[tx ty].\begin{bmatrix} x'\ y' \end{bmatrix} ============= \begin{bmatrix} a&b\ c&d \end{bmatrix} \begin{bmatrix} x\ y \end{bmatrix} + \begin{bmatrix} t_x\ t_y \end{bmatrix}.

展开矩阵乘法,得到:

x=ax+by+tx,x'=ax+by+t_x, y=cx+dy+ty.y'=cx+dy+t_y.

其中:

  • (x,y)(x,y) 是变换前的点;
  • (x,y)(x',y') 是变换后的点;
  • 矩阵
A=[ab cd]A= \begin{bmatrix} a&b\ c&d \end{bmatrix}

控制旋转、缩放、反射和错切等线性变化;

  • 向量
t=[tx ty]\mathbf t= \begin{bmatrix} t_x\ t_y \end{bmatrix}

控制平移。

因此,仿射变换可以简写为:

T(x)=Ax+t.T(\mathbf x)=A\mathbf x+\mathbf t.

2. 一个具体的仿射变换 #

考虑下面的变换:

[x y]=============[23 45][x y]+[1 2].\begin{bmatrix} x'\ y' \end{bmatrix} ============= \begin{bmatrix} 2&3\ 4&5 \end{bmatrix} \begin{bmatrix} x\ y \end{bmatrix} + \begin{bmatrix} 1\ -2 \end{bmatrix}.

展开后为:

x=2x+3y+1,x'=2x+3y+1, y=4x+5y2.y'=4x+5y-2.

A=[23 45],t=[1 2].A= \begin{bmatrix} 2&3\ 4&5 \end{bmatrix}, \qquad \mathbf t= \begin{bmatrix} 1\ -2 \end{bmatrix}.

那么:

T(x)=Ax+t.T(\mathbf x)=A\mathbf x+\mathbf t.

下面通过这个例子推导仿射变换的主要性质。


3. 两点之差不受平移影响 #

设平面上有两个点:

P=(x1,y1),Q=(x2,y2).P=(x_1,y_1), \qquad Q=(x_2,y_2).

它们经过仿射变换后分别为:

T(P)=AP+t,T(P)=AP+\mathbf t, T(Q)=AQ+t.T(Q)=AQ+\mathbf t.

两者相减:

T(Q)T(P)=(AQ+t)(AP+t) =A(QP).\begin{aligned} T(Q)-T(P) &=(AQ+\mathbf t)-(AP+\mathbf t)\ &=A(Q-P). \end{aligned}

所以:

T(Q)T(P)=A(QP).\boxed{T(Q)-T(P)=A(Q-P)}.

这个公式说明,平移向量 t\mathbf t 在两点相减时会被抵消。

因此:

  • 点的位置变化由 AAt\mathbf t 共同决定;
  • 线段的方向、长度变化和平行关系主要由矩阵 AA 决定。

4. 仿射变换将直线变成直线 #

一条经过点 PP、方向向量为 v\mathbf v 的直线可以写成:

x(s)=P+sv.\mathbf x(s)=P+s\mathbf v.

其中 ss 是参数。

对直线上的点进行仿射变换:

T(x(s))=A(P+sv)+t =AP+sAv+t =T(P)+sAv.\begin{aligned} T(\mathbf x(s)) &=A(P+s\mathbf v)+\mathbf t\ &=AP+sA\mathbf v+\mathbf t\ &=T(P)+sA\mathbf v. \end{aligned}

变换后的方程仍然具有“一个固定点加参数乘方向向量”的形式,因此它仍然是一条直线。

所以:

仿射变换将直线映射为直线。\boxed{\text{仿射变换将直线映射为直线。}}

示例 #

原来的 xx 轴可以表示为:

(x,y)=(s,0).(x,y)=(s,0).

代入变换:

x=2s+1,x'=2s+1, y=4s2.y'=4s-2.

因此变换后的点为:

(x,y)=(1,2)+s(2,4).(x',y')=(1,-2)+s(2,4).

这仍然是一条直线,其方向向量由原来的 (1,0)(1,0) 变成了 (2,4)(2,4)


5. 仿射变换保持平行性 #

假设两条直线的方向向量分别为:

v\mathbf v

λv.\lambda\mathbf v.

因为两个方向向量成比例,所以这两条直线平行。

经过仿射变换后,它们的方向向量变为:

AvA\mathbf v

A(λv)=λAv.A(\lambda\mathbf v)=\lambda A\mathbf v.

变换后的方向向量仍然成比例,因此两条直线仍然平行。

所以:

可逆仿射变换保持平行关系。\boxed{\text{可逆仿射变换保持平行关系。}}

这里强调“可逆”,是因为如果 AA 不可逆,某个非零方向向量可能被压缩为零向量,甚至整个平面可能被压缩到一条直线上。


6. 仿射变换保持同一直线上的比例 #

设点 RR 位于线段 PQPQ 所在的直线上,并满足:

R=(1λ)P+λQ.R=(1-\lambda)P+\lambda Q.

0λ10\leq\lambda\leq1 时,RR 位于线段 PQPQ 内部。

RR 进行仿射变换:

T(R)=A((1λ)P+λQ)+t =(1λ)AP+λAQ+t.\begin{aligned} T(R) &=A\bigl((1-\lambda)P+\lambda Q\bigr)+\mathbf t\ &=(1-\lambda)AP+\lambda AQ+\mathbf t. \end{aligned}

因为:

(1λ)+λ=1,(1-\lambda)+\lambda=1,

所以平移向量可以写成:

t=(1λ)t+λt.\mathbf t=(1-\lambda)\mathbf t+\lambda\mathbf t.

因此:

T(R)=(1λ)(AP+t)+λ(AQ+t) =(1λ)T(P)+λT(Q).\begin{aligned} T(R) &=(1-\lambda)(AP+\mathbf t) +\lambda(AQ+\mathbf t)\ &=(1-\lambda)T(P)+\lambda T(Q). \end{aligned}

所以:

T((1λ)P+λQ)===================================(1λ)T(P)+λT(Q).\boxed{ T\bigl((1-\lambda)P+\lambda Q\bigr) =================================== (1-\lambda)T(P)+\lambda T(Q) }.

这说明仿射变换保持同一直线上的分点比例。


7. 仿射变换保持中点 #

线段 PQPQ 的中点为:

M=P+Q2.M=\frac{P+Q}{2}.

这相当于取:

λ=12.\lambda=\frac12.

根据前面的结论:

T(M)====T(P)+T(Q)2.T(M) ==== \frac{T(P)+T(Q)}{2}.

所以原线段的中点,经过仿射变换后,仍然是新线段的中点。

即:

仿射变换保持中点。\boxed{\text{仿射变换保持中点。}}

示例 #

取:

P=(0,0),Q=(2,0).P=(0,0), \qquad Q=(2,0).

中点为:

M=(1,0).M=(1,0).

经过变换:

T(P)=(1,2),T(P)=(1,-2), T(Q)=(5,6),T(Q)=(5,6), T(M)=(3,2).T(M)=(3,2).

而变换后两个端点的中点为:

(1,2)+(5,6)2======================(3,2).\frac{(1,-2)+(5,6)}{2} ====================== (3,2).

它正好等于 T(M)T(M)


8. 仿射变换保持重心 #

设三角形的三个顶点为 P1,P2,P3P_1,P_2,P_3,其重心为:

G=P1+P2+P33.G=\frac{P_1+P_2+P_3}{3}.

经过仿射变换:

T(G)=A(P1+P2+P33)+t =AP1+AP2+AP33+t =T(P1)+T(P2)+T(P3)3.\begin{aligned} T(G) &=A\left(\frac{P_1+P_2+P_3}{3}\right)+\mathbf t\ &=\frac{AP_1+AP_2+AP_3}{3}+\mathbf t\ &=\frac{T(P_1)+T(P_2)+T(P_3)}{3}. \end{aligned}

因此:

仿射变换保持三角形的重心。\boxed{\text{仿射变换保持三角形的重心。}}

更一般地,如果:

X=i=1nλiPi,X=\sum_{i=1}^{n}\lambda_iP_i,

并且:

i=1nλi=1,\sum_{i=1}^{n}\lambda_i=1,

那么:

T(X)=i=1nλiT(Pi).T(X)=\sum_{i=1}^{n}\lambda_iT(P_i).

这种系数之和等于 11 的线性组合称为仿射组合。

所以,仿射变换最重要的代数性质是:

仿射变换保持仿射组合。\boxed{\text{仿射变换保持仿射组合。}}

9. 仿射变换保持凸组合 #

如果仿射组合中的系数还满足:

λi0,\lambda_i\geq0,

并且:

i=1nλi=1,\sum_{i=1}^{n}\lambda_i=1,

那么这个组合称为凸组合。

也就是说:

X=i=1nλiPiX=\sum_{i=1}^{n}\lambda_iP_i

位于控制点集合的凸包内。

经过仿射变换:

T(X)=i=1nλiT(Pi).T(X)=\sum_{i=1}^{n}\lambda_iT(P_i).

系数没有发生改变,因此凸组合关系仍然成立。

所以仿射变换也会把一个图形的凸包映射为变换后控制点的凸包。


10. 面积如何变化 #

二维仿射变换对面积的缩放倍数,由矩阵 AA 的行列式决定。

若原图形面积为 SS,则变换后面积为:

S=detAS.S'=|\det A|S.

本例中:

A=[23 45].A= \begin{bmatrix} 2&3\ 4&5 \end{bmatrix}.

其行列式为:

\det A ====== # 2\cdot5-3\cdot4 -2.

因此:

detA=2.|\det A|=2.

这说明:

变换后的面积是原面积的两倍。\boxed{\text{变换后的面积是原面积的两倍。}}

行列式为负数还表示图形的方向发生反转。

例如,一个顶点按逆时针排列的三角形,经过该变换后会变成顺时针排列。

因此本例同时具有两个效果:

  • 面积扩大为原来的两倍;
  • 图形方向发生翻转。

11. 仿射变换一般不保持长度 #

考虑原来的单位向量:

e1=[1 0].\mathbf e_1= \begin{bmatrix} 1\ 0 \end{bmatrix}.

经过矩阵 AA 变换后:

Ae1============[23 45][1 0]=============[2 4].A\mathbf e_1 ============ \begin{bmatrix} 2&3\ 4&5 \end{bmatrix} \begin{bmatrix} 1\ 0 \end{bmatrix} ============= \begin{bmatrix} 2\ 4 \end{bmatrix}.

原向量长度为:

e1=1.|\mathbf e_1|=1.

变换后的长度为:

|A\mathbf e_1| ============== # \sqrt{2^2+4^2} \sqrt{20}.

长度发生了改变。

再看另一个单位向量:

e2=[0 1].\mathbf e_2= \begin{bmatrix} 0\ 1 \end{bmatrix}.

变换后:

Ae2============[3 5].A\mathbf e_2 ============ \begin{bmatrix} 3\ 5 \end{bmatrix}.

其长度为:

|A\mathbf e_2| ============== # \sqrt{3^2+5^2} \sqrt{34}.

两个原本长度相同的单位向量,变换后的长度并不相同。

所以:

一般仿射变换不保持长度。\boxed{\text{一般仿射变换不保持长度。}}

12. 仿射变换一般不保持角度 #

原来的两个单位向量:

e1=(1,0),e2=(0,1)\mathbf e_1=(1,0), \qquad \mathbf e_2=(0,1)

互相垂直,因为:

e1e2=0.\mathbf e_1\cdot\mathbf e_2=0.

经过变换后:

Ae1=(2,4),A\mathbf e_1=(2,4), Ae2=(3,5).A\mathbf e_2=(3,5).

计算点积:

(2,4)\cdot(3,5) =============== # 2\cdot3+4\cdot5 26.

由于:

260,26\neq0,

所以变换后的两个方向不再垂直。

因此:

一般仿射变换不保持角度和垂直关系。\boxed{\text{一般仿射变换不保持角度和垂直关系。}}

13. 仿射变换一般不保持圆 #

圆的方程为:

x2+y2=r2.x^2+y^2=r^2.

经过一般的非均匀缩放、错切等仿射变换后,圆通常会变成椭圆。

例如:

x=2x,y=y.x'=2x, \qquad y'=y.

相当于将水平方向放大两倍。

原来的圆:

x2+y2=1x^2+y^2=1

会变为:

x24+y2=1.\frac{x'^2}{4}+y'^2=1.

这是一条椭圆。

所以:

一般仿射变换不保持圆,但会把圆锥曲线变成圆锥曲线。\boxed{\text{一般仿射变换不保持圆,但会把圆锥曲线变成圆锥曲线。}}

14. 仿射变换何时可逆 #

仿射变换:

T(x)=Ax+tT(\mathbf x)=A\mathbf x+\mathbf t

是否可逆,取决于矩阵 AA 是否可逆。

在二维中,条件是:

detA0.\det A\neq0.

本例中:

detA=20,\det A=-2\neq0,

因此该仿射变换可逆。

原方程为:

x=2x+3y+1,x'=2x+3y+1, y=4x+5y2.y'=4x+5y-2.

解出原坐标:

x=52x+32y+112,x=-\frac52x'+\frac32y'+\frac{11}{2}, y=2xy4.y=2x'-y'-4.

因此,每一个变换后的点 (x,y)(x',y') 都唯一对应一个原来的点 (x,y)(x,y)

如果:

detA=0,\det A=0,

那么变换不可逆,可能发生以下情况:

  • 整个平面被压缩到一条直线上;
  • 整个平面被压缩到一个点;
  • 不同的原始点被映射到同一个点。

15. 仿射变换的齐次坐标表示 #

普通矩阵乘法只能直接表示线性变换,不能直接表示平移。

为了把线性变化和平移统一为一次矩阵乘法,可以使用齐次坐标。

将二维点 (x,y)(x,y) 写成:

[x y 1].\begin{bmatrix} x\ y\ 1 \end{bmatrix}.

仿射变换可以写成:

[x y 1]=============[abtx cdty 001][x y 1].\begin{bmatrix} x'\ y'\ 1 \end{bmatrix} ============= \begin{bmatrix} a&b&t_x\ c&d&t_y\ 0&0&1 \end{bmatrix} \begin{bmatrix} x\ y\ 1 \end{bmatrix}.

对于本文的例子:

[x y 1]=============[231 452 001][x y 1].\begin{bmatrix} x'\ y'\ 1 \end{bmatrix} ============= \begin{bmatrix} 2&3&1\ 4&5&-2\ 0&0&1 \end{bmatrix} \begin{bmatrix} x\ y\ 1 \end{bmatrix}.

使用齐次坐标后:

  • 平移可以写成矩阵乘法;
  • 多次仿射变换可以通过矩阵相乘进行合并;
  • 更适合计算机图形学中的统一实现。

16. 常见仿射变换 #

16.1 平移 #

x=x+tx,x'=x+t_x, y=y+ty.y'=y+t_y.

矩阵形式:

T(x)=Ix+t.T(\mathbf x)=I\mathbf x+\mathbf t.

16.2 缩放 #

x=sxx,x'=s_xx, y=syy.y'=s_yy.

对应矩阵:

A=[sx0 0sy].A= \begin{bmatrix} s_x&0\ 0&s_y \end{bmatrix}.

sx=sys_x=s_y 时是等比例缩放;当 sxsys_x\neq s_y 时是非均匀缩放。


16.3 旋转 #

绕原点逆时针旋转 θ\theta

[x y]=============[cosθsinθ sinθcosθ][x y].\begin{bmatrix} x'\ y' \end{bmatrix} ============= \begin{bmatrix} \cos\theta&-\sin\theta\ \sin\theta&\cos\theta \end{bmatrix} \begin{bmatrix} x\ y \end{bmatrix}.

16.4 错切 #

水平方向错切:

x=x+ky,x'=x+ky, y=y.y'=y.

对应矩阵:

A=[1k 01].A= \begin{bmatrix} 1&k\ 0&1 \end{bmatrix}.

16.5 反射 #

关于 xx 轴反射:

x=x,x'=x, y=y.y'=-y.

对应矩阵:

A=[10 01].A= \begin{bmatrix} 1&0\ 0&-1 \end{bmatrix}.

这些变换以及它们的任意组合,仍然都是仿射变换。


17. 为什么 B 样条具有仿射不变性 #

一条 pp 次 B 样条曲线定义为:

C(u)=i=0nNi,p(u)Pi.C(u)=\sum_{i=0}^{n}N_{i,p}(u)P_i.

其中:

  • PiP_i 是控制点;
  • Ni,p(u)N_{i,p}(u) 是 B 样条基函数。

B 样条基函数满足单位分解性质:

i=0nNi,p(u)=1.\sum_{i=0}^{n}N_{i,p}(u)=1.

设仿射变换为:

T(x)=Ax+t.T(\mathbf x)=A\mathbf x+\mathbf t.

对曲线进行仿射变换:

T(C(u))=A(i=0nNi,p(u)Pi)+t =i=0nNi,p(u)APi+t.\begin{aligned} T(C(u)) &=A\left(\sum_{i=0}^{n}N_{i,p}(u)P_i\right)+\mathbf t\ &=\sum_{i=0}^{n}N_{i,p}(u)AP_i+\mathbf t. \end{aligned}

利用:

i=0nNi,p(u)=1,\sum_{i=0}^{n}N_{i,p}(u)=1,

可以写成:

t=========i=0nNi,p(u)t.\mathbf t ========= \sum_{i=0}^{n}N_{i,p}(u)\mathbf t.

于是:

T(C(u))=i=0nNi,p(u)APi+i=0nNi,p(u)t =i=0nNi,p(u)(APi+t) =i=0nNi,p(u)T(Pi).\begin{aligned} T(C(u)) &=\sum_{i=0}^{n}N_{i,p}(u)AP_i +\sum_{i=0}^{n}N_{i,p}(u)\mathbf t\ &=\sum_{i=0}^{n}N_{i,p}(u)(AP_i+\mathbf t)\ &=\sum_{i=0}^{n}N_{i,p}(u)T(P_i). \end{aligned}

因此:

T(C(u))=======i=0nNi,p(u)T(Pi).\boxed{ T(C(u)) ======= \sum_{i=0}^{n}N_{i,p}(u)T(P_i) }.

这说明:

先生成 B 样条曲线,再对整条曲线做仿射变换,与先对所有控制点做相同的仿射变换,再重新生成 B 样条曲线,结果完全相同。

这就是 B 样条曲线的仿射不变性。


18. 仿射变换保持哪些性质 #

仿射变换通常保持:

  • 直线性;
  • 共线性;
  • 平行性;
  • 同一直线上的比例;
  • 中点;
  • 重心;
  • 仿射组合;
  • 凸组合;
  • 凸包关系。

仿射变换一般不保持:

  • 长度;
  • 角度;
  • 垂直关系;
  • 圆;
  • 面积的具体数值。

但面积会按照统一倍数变化:

S=detAS.S'=|\det A|S.

19. 仿射变换与其他几何变换的关系 #

常见变换之间可以写成如下包含关系:

刚体变换相似变换仿射变换射影变换.\text{刚体变换} \subset \text{相似变换} \subset \text{仿射变换} \subset \text{射影变换}.

刚体变换 #

保持长度和角度,包括:

  • 平移;
  • 旋转;
  • 反射。

相似变换 #

在刚体变换的基础上允许统一缩放,保持角度和形状。

仿射变换 #

允许非均匀缩放和错切,保持直线和平行关系,但不一定保持长度与角度。

射影变换 #

保持直线,但不一定保持平行性。例如透视摄影中,现实中的平行铁轨在图像中可能相交于消失点。


20. 总结 #

二维仿射变换的基本形式为:

T(x)=Ax+t.\boxed{ T(\mathbf x)=A\mathbf x+\mathbf t }.

其中,矩阵 AA 控制线性形变,向量 t\mathbf t 控制平移。

仿射变换最核心的性质来自两个公式。

第一个公式是:

T(Q)T(P)=A(QP).\boxed{ T(Q)-T(P)=A(Q-P) }.

它说明平移不影响两点之间的方向差。

第二个公式是:

T(iλiPi)================================iλiT(Pi),iλi=1.\boxed{ T\left(\sum_i\lambda_iP_i\right) ================================ \sum_i\lambda_iT(P_i), \qquad \sum_i\lambda_i=1 }.

它说明仿射变换保持仿射组合。

由此可以推出:

  • 直线仍然是直线;
  • 平行线仍然平行;
  • 中点仍然是中点;
  • 重心仍然是重心;
  • 同一直线上的比例保持不变;
  • B 样条只需变换控制点,就能得到整条曲线的仿射变换结果。

因此,在几何建模和计算机图形学中,仿射变换之所以重要,不仅是因为它能表示多种常见变换,更因为它能够保留大量有用的几何结构。

(完)

目录