计算机图形学几何工具算法详解(1-4)

数值计算的问题

浮点数计算的困境

底层问题

当浮点数相加时,大的会覆盖小的。 在浮点数运算中,如果f(r)比f(s)和f(t)大得多,那么就有 [f(r)+f(s) = f(r),f(r)+f(t) = f(r)Rightarrow (f(r)+f(s))+f(t)=f(r)] 但有可能f(s)+f(t)足够大导致: [f(r)+(f(s)+f(t))ne f(r)] 这样就违反了结合性(associativity)。所以就规定加法的时候 [有r_{i_1}leq...leq r_{i_n},(((f(r_{i_1})+f(r_{i_2}))+f(r_{i_3}))+ ... +f(r_{i_n}))]

另外两种需要关注的浮点问题:两个几乎相等的数相减,或者除以接近零的数。这两种情况都将产生不可接受的四舍五入误差。例子: [ax^2+bx+c = 0, ane 0] [x_1=frac{-b+sqrt{b^2-4ac}}{2a},x_2=frac{-b-sqrt{b^2-4ac}}{2a}qquad 1] [x_1=frac{-2c}{b+sqrt{b^2-4ac}},x_2=frac{-2c}{b-sqrt{b^2-4ac}}qquad 2]

1,2两种解的形式等价。如果(b>0并且b^2比4ac大的多),则(sqrt{b^2-4ac}approx b)

  1. (x_1)的有效数字将损失,(x_2)不受影响。
  2. (x_1)不受影响,(x_2)受到了除以接近零的影响。 所以应该考虑不同情况使用不同的公式求解。

另一个问题,理论上(b^2-4acge 0),但是浮点数的运算可能导致(b^2-4ac < 0),所以计算平方根的安全方法是使用(sqrt {max {(0, b^2-4ac)}})

高层问题

浮点数系统存在一些主要的陷阱,其中之一就是排中律(Law of the Excluded Middle)。 就是S or not S恒为真在浮点系统中不成立。

  • 共线,共面或共点的问题,在这些算法的理论讨论中往往假设这些问题不会存在,在浮点系统中都要谨慎判断。
  • 交点问题。多重次根。
  • 输入参数次序问题。判断输入A和B相交,B和A相交的结果要一样。

第2章 矩阵和线性空间

矩阵

转置

矩阵转置有一些属性:

  1. ((AB)^T = B^TA^T)
  2. ((A^T)^T = A)
  3. ((A+B)^T= A^T+B^T)
  4. ((kA)^T=k(A)^T)

线性系统

一般线性系统

[AX=C] [begin{bmatrix} a_{1,1} & a_{1,2} & cdots & a_{1,n} \ a_{2,1} & a_{2,2} & cdots & a_{2,n} \ & & vdots & \ a_{m,1} & a_{m,2} & cdots & a_{m,n} end{bmatrix} begin{bmatrix} x_1 \ x_2 \ vdots\ x_n end{bmatrix} =begin{bmatrix} c_1 \ c_2 \ vdots\ c_m end{bmatrix}]

矩阵A coefficient matrix(系数矩阵), [ begin{bmatrix} a_{1,1} & a_{1,2} & cdots & a_{1,n} & c_1\ a_{2,1} & a_{2,2} & cdots & a_{2,n} & c_2\ & & vdots & \ a_{m,1} & a_{m,2} & cdots & a_{m,n} & c_m end{bmatrix} ] 这是augmented matrix(增广矩阵).

减行、阶梯形状和秩

高斯消除(Gaussian elimination) 过程中,在回代之前,我们会得到一个梯形形式的矩阵: [ begin{array}{lcr} b_{1,1}x_1+b_{1,2}x_2+b_{1,3}x_3+cdots+b_{1,n}x_n&=&d_1 \ b_{2,k_2}x_2+b_{2,k_3}x_3+cdots+b_{2,n}x_n&=&d_2 \ &vdots\ b_{r,k_r}x_{k_r}+ cdots +b_{r,n}x_n&=&d_r end{array} ] 消除过程中我们可能得到一些这种形式的方程 [0x_1+0x_2+cdots+0x_n=c_i]

如果 (c_i=0), 可以立即消除方程。
如果 (c_ine0), 那么系统没有解(inconsistent),我们可以立即终止求解。结论是这些对行的运算可以不断使系统变小。

  • If r = n, 系统有唯一解。
  • If (r<n), 未知数比方程多,意味着系统有许多解。

通常把那些不会改变线性系统和矩阵表示的解集的变换叫做初等行变换(elementary row operations):

  • 交换两行
  • 一个非零常数乘以一行
  • 用两行之和替代其中一行

导致至少消去一个非零行元素的运算组合叫做减行(row reduction) 完全减行后,矩阵不能进一步减行,方程和矩阵都将变成梯形(echelom form),这样的矩阵的方程的个数叫做矩阵的秩(rank)

如果有两个行向量是线性相关的,即: [ a_1,a_2in mathbb{R},a_1vec{v}_i+a_2vec{v}_j=0 ] 所以秩等于阶梯型矩阵的线性无关(linear independence) 的数目。如果秩等于维数(dimension) ,则矩阵的行可以作为矩阵所定义空间的基(basis)

方阵

对角矩阵

对角矩阵的属性:

  • 如果A和B是对角矩阵,C=AB也是对角矩阵。(c_{i,i}=a_{i,i}b_{i,i})
  • 交换性。C=AB=BA
  • 对角矩阵A,常规矩阵B,如果有C=AB,那么C的第i行就是(a_{i,i})乘以B的第i行。如果C=BA,那么C的第i列等于(a_{i,i})乘以B的第i列

标量矩阵

标量矩阵就是对角线上值一样的对角矩阵。

单位矩阵

单位矩阵对角线上值都是1的对角矩阵。IM = MI = M,I就是对角矩阵

三角矩阵

[ begin{bmatrix} a_{1,1} & a_{1,2} & cdots & a_{1,n} \ 0 & a_{2,2} & cdots & a_{2,n} \ vdots & vdots & ddots & vdots \ 0 & 0 & cdots & a_{m,n} end{bmatrix} ] 三角矩阵属性:

  • 如果A和B是下三角矩阵(lower triangular),那么C=AB也是下三角矩阵。
  • 如果A和B是下三角矩阵=,那么C=A+B也是下三角矩阵。
  • 如果A是可逆的(invertible)下三角矩阵=,那么(A^{-1})也是下三角矩阵。

行列式

一般行列式的计算方法

计算行列式的通用方法叫行列式的子式展开(determinnant expansion minors)或拉普拉斯展开式(Laplacian expansion)。为了理解它,我们定义几个术语:子矩阵(submatrix)、子式(minor)和余子式(cofactor)。

对于矩阵M,删除第i行,第j列后得到子矩阵(M_{ij}^prime),它的行列式就是子式。M的元素(a_{i,j})的余子式(c_{i,j})就是该元素的子式或子式的相反数: [ c_{i,j} = (-1)^{i+j}left| M_{ij}^prime right| ]

计算行列式可以用某一行的元素乘和其余子式乘积的和 [ begin{vmatrix} a_{1,1} & a_{1,2} &a_{1,3} \ a_{2,1} & a_{2,2} &a_{2,3} \ a_{3,1} & a_{3,2} &a_{3,3} \ end{vmatrix} =a_{1,1} begin{vmatrix} a_{2,2} &a_{2,3} \ a_{3,2} &a_{3,3} \ end{vmatrix} -a_{1,2} begin{vmatrix} a_{2,1} &a_{2,3} \ a_{3,1} &a_{3,3} \ end{vmatrix} +a_{1,3} begin{vmatrix} a_{2,1} &a_{2,2} \ a_{3,1} &a_{3,2} \ end{vmatrix} ]

一般的,(ntimes n)矩阵的行列式可降价为((n-1)times (n-1))的行列式的倍数之和,直到单个数为止。

行列式的性质

  • (|M|=|M^T|)
  • (|MM_1|=0|M||M_1|)
  • (|M^{-1}=1/|M|)
  • (|I|=1)
  • (|alpha M|=alpha^n|M|)
  • 交换M的任意两行(或两列)将改变|M|的符号
  • 常数(alpha)乘以M的任意行(或列)的所有元素,行列式等于(alpha|M|)
  • 如果M的两行(或两列)相同,则|M|=0
  • 三角形矩阵的行列式等于对角线上元素之积

逆矩阵

逆矩阵的几种求法

如果有方阵M,如果它存在逆矩阵(M^{-1},则M^{-1}的元素a_{i,j}^{-1})定义为: [ a_{i,j}^{-1} = frac{(-1)^{i+j}|M_{j,i}^prime|}{|M|} ] 该式的分子就是一个余子式,因此我们可以写为: [ M^{-1}=frac{C^T}{|M|} ] 转置是因为下表次序为就j,i。(C^T)也叫作M的伴随矩阵(adjoint)

逆矩阵的性质

  • 如果(MM^{-1}=I, 则M^{-1}M=I)
  • ((M_1M-2)^{-1}=M_2^{-1}M_1^{-1})
  • ((M^{-1})^{-1}=M)
  • ((alpha M)^{-1}=(1/alpha)M^{-1}(alpha ne 0))

逆矩阵存在的情况

  • 其秩为n
  • 它是非奇异的
  • (|M|ne 0)
  • 它的行(列)是线性无关的
  • 把它作为一个变换,并不会减少维数

奇异矩阵

如果M是一个方阵((n times n))并且其行列式值为非零((|M|ne 0)),则称矩阵M为非奇异的(nonsingular)的。任何不满足上述条件的都称为奇异的(singular)。

充要条件:

  • (|M|ne 0)
  • 其秩为n
  • 矩阵(M^{-1})存在
  • 其次系统MX=0仅有一个简单解X=0

最后一个表明当且仅当(|M|=0)时,齐次系统MX=0有一个非简单解((Xne 0))。

线性空间

线性映射

特征值和特征向量

如果有 [ vec{v}M=lambda vec{v} ] 可以找到值(lambda)的向量(vec{v})叫做M的特征向量(eigenvector),值(lambda)叫做特征值(eigenvalue)。M只是缩放了(vec{v})

可以推出 [ vec{v}(lambda I-M)=vec{0} ] 只要(vec{v})不是(vec{0})向量则必定有 [|lambda I-M|=0]

该式叫做特征多项式(characteristic polynomial)

欧几里得空间

内积空间

内积为点积的(mathbb{R}^n)上的内积空间定义为欧几里得空间。

正交和标准正交集

具有标准正交坐标系的欧几里得空间称为笛卡尔空间。

设欧几里得空间(mathcal{V}), 向量 (V_{1}^prime ={vec{v_1},vec{v_1}, dotsc, vec{v_n} }) (其中(k< n,n)(mathcal{V})的维数)的一个标准正交集是某些基底向量集合的一个子集,因此他必定是线性无关的,而且对于任何 [vec{v}inmathcal{V} ] [vec{w}=vec{u}- langle vec{u,vec{v_1}} rangle vec{v_1} - dotsc-langle vec{u,vec{v_k}} rangle vec{v_k}] 向量(vec{w})对每一个(vec{v_i}in V^prime)都是正交的。

(mathcal{V})是一个内积空间,并且(V={vec{v_1}, vec{v_2},dotsc,vec{v_n}})是它的一个基底,可以利用格拉姆-施密特正交化方法构造一个正交基底(U={vec{u_1}, vec{u_2},dotsc,vec{u_n}}) [vec{u_1}=frac{vec{v_1}}{||vec{v_1}||}] [vec{u_2}=frac{vec{v_2}- langlevec{v_2},vec{u_1} rangle vec{u_1}}{||vec{v_2}- langlevec{v_2},vec{u_1} rangle vec{u_1}||}] [vec{u_3}=frac{vec{v_3}- langlevec{v_3},vec{u_1} rangle vec{u_1} - langlevec{v_3},vec{u_2} rangle vec{u_2}}{||vec{v_3}- langlevec{v_3},vec{u_1} rangle vec{u_1} - langlevec{v_3},vec{u_2} rangle vec{u_2}||}]

一直重复计算(u_i,最后我们得到mathcal{V})的一个标准正交基底。

最小二乘法

LeastSquaresMethod
LeastSquaresMethod

这些点和直线距离的平方和: [D^2 = (f(x_1)-y_1)^2 +(f(x_2)-y_2)^2+dotsc+(f(x_n)-y_n)^2] [D^2 = (mx_1+b-y_1)^2 +(mx_2+b-y_2)^2+dotsc+(mx_n+b-y_n)^2]

所以我们需要选取直线(f(x)= mx+b的m和b)使(D^2)最小,当(D^2)对m和b的偏导同时为零时,它取到最小值。对当前形式有求解系统: [(mx_1+b-y_1) +(mx_2+b-y_2)+(mx_3+b-y_3) = 0] [x_1(mx_1+b-y_1) +x_2(mx_2+b-y_2)+x_3(mx_3+b-y_3) = 0]

用矩阵形式可得:

[begin{bmatrix} 1 & 1 & 1 \ x_1 &x_2& x_3 end{bmatrix} begin{bmatrix} mx_1+b-y_1\ mx_2+b-y_2\ mx_3+b-y_3\ end{bmatrix}]

[begin{bmatrix} 1 & 1 & 1 \ x_1 &x_2& x_3 end{bmatrix} left( begin{bmatrix} 1 &x_1 \ 1 &x_2 \ 1 &x_3 \ end{bmatrix} begin{bmatrix} b \ m \ end{bmatrix} -begin{bmatrix} y_1 \ y_2 \ y_3 \ end{bmatrix} right) =begin{bmatrix} 0\ 0\ end{bmatrix}]

[设M=begin{bmatrix} 1 &x_1 \ 1 &x_2 \ 1 &x_3 \ end{bmatrix} , [f]= begin{bmatrix} b \ m \ end{bmatrix} [y]= begin{bmatrix} y_1 \ y_2 \ y_3 \ end{bmatrix}]

那么有:

[mathbf{M}^Tleft(mathbf{M}[f]-[y]right)=mathbf{0}] [Rightarrowmathbf{M}^Tmathbf{M}[f]=mathbf{M}^T[y]] [Rightarrow [f]=left( mathbf{M}^Tmathbf{M} right)^{-1}mathbf{M}^T[y]]

(mathbf{M}^Tmathbf{M})是一个方阵,且(x_1,x_2,x_3)是不相等的,所以它可逆。

第3章 向量代数

向量空间

性质:

  • 定义了向量的加法(或减法),其结果是另一个向量。
  • 集合(mathcal{V})对线性组合是封闭的:如果有(vec{u},vec{v}in mathcal{V})(alpha, beta in mathbb{R}),则(alpha vec{u}+beta vec{v}in mathcal{V})
  • 存在一个唯一得向量(vec{0}in mathcal{V}),叫做零向量,它具有以下性质: [a.forall vec{v}in mathcal{V},0·vec{v}=vec{0} , 其中0in mathbb{R}] [b.forall vec{v}in mathcal{V}, vec{0}+vec{v} = vec{v}]

生成空间

有集合({vec{v_1},vec{v_2},dotsc,vec{v_n}}in mathcal{V}),这些向量的所有线性组合的集合S的空间叫做由 ({vec{v_1},vec{v_2},dotsc,vec{v_n}})所生成的生成空间。任意(vec{w}in S,vec{w} = lambda_1 vec{v_1}+lambda_2 vec{v_2}+dotsc+lambda_n vec{v_n},lambda_i in mathbb{R}),集合({vec{v_1},vec{v_2},dotsc,vec{v_n}})叫做S的生成集

线性无关

对于集合({vec{v_1},vec{v_2},dotsc,vec{v_n}}in mathcal{V})是线性相关的,那么存在不全为零的数(lambda_1, lambda_2, dotsc , lambda_n),使得 [lambda_1 vec{v_1}+lambda_2 vec{v_2}+dotsc+lambda_n vec{v_n}=vec{0}] 如果仅当(lambda_1=0, lambda_2=0, dotsc , lambda_n=0)时上式成立,则称他们是线性无关的。

基底、子空间和维数

如果有向量空间S,如果满足

  • ({vec{v_1}, vec{v_2}, dotsc vec{v_n}})是线性无关的
  • ({vec{v_1}, vec{v_2}, dotsc vec{v_n}})是S的一个生成集

则集合({vec{v_1}, vec{v_2}, dotsc vec{v_n}})是S的一个基底。 如果有向量空间(mathcal{V}) 和一些基底向量集合(V={vec{v_1},vec{v_2},dotsc,vec{v_n}}in mathcal{V}),那么(V)的生成空间(S叫做mathcal{V})的子空间。(S)的维数n定义为(S)中线性无关向量的最大个数。

(V={vec{v_1},vec{v_2},dotsc,vec{v_n}}in mathcal{V})(mathcal{V})的一个基底,则(mathcal{V})中的每一个向量都可以写成(vec{v_1}, vec{v_2}, dotsc vec{v_n})的唯一一个线性组合。
【证明】假定有(vec{w}in mathcal{V},那么存在c_1,c_2,dotsc,c_n in mathbb{R})使得 [vec{w}=c_1vec{v_1}+c_2vec{v_2}+dotsc+c_nvec{v_n}] 假设这些常数不是唯一得 [vec{w}=d_1vec{v_1}+d_2vec{v_2}+dotsc+d_nvec{v_n}] 其中一些(c_ine d_i),name [vec{0}=(d_1-c_1)vec{v_1}+(d_2-c_2)vec{v_2}+dotsc+(d_n-c_n)vec{v_n}]

由线性无关我们已知,生成零向量的线性组合的系数全部都为零,这意味着(d_i=c_i,forall i in 1 dotsc n)

方向

RightHandRule
RightHandRule

基底变化

任何(vec{w}in mathcal{V})都可以表示为任意选取的基底向量集合的一个线性组合。可以用无数种基底向量来表示(vec{w})

线性变换

LinearTransformation
LinearTransformation

仿射空间

一个仿射空间(affine space)(mathcal{A})由一个点集(mathcal{P})和一个向量集(mathcal{V})所构成,它是由一些基底或(mathcal{V})的基底所生成的向量空间。(mathcal{A})的维数n就是(mathcal{V})的维数。我们将(mathcal{A})的点表示为(mathcal{A}.mathcal{P}),向量表示为(mathcal{A}.mathcal{V})。 上述定义直观的说明了点空间与构建一个仿射空间的向量空间之间的关系。可以用更正规的定义点对之间的减法的公理,即所谓的“首尾相接”公理:

  • (forall P,Qin mathcal{A}.mathcal{P},exists 一个唯一的向量vec{v}in mathcal{A}.mathcal{V},使得vec{v}=P-Q)
  • (forall Qin mathcal{A}.mathcal{P},forallvec{v}in mathcal{A}.mathcal{V},exists 一个唯一的点P,使得P-Q=vec{v})
  • (forall P,Q,Rin mathcal{A}.mathcal{P},(P-Q)+(Q-R) = P_R)
AffineSpace
AffineSpace

欧几里得几何

数量积

点积性质:

  • 定义:(vec{u}cdot vec{v}= rVertvec{u}rVertrVertvec{v}rVertcos theta)
  • 双线性:(forall alpha,beta in mathbb{R},且forallvec{u},vec{v},vec{w}in mathcal{A}.mathcal{V})
    • ((alphavec{u}+betavec{v})cdotvec{w} = alpha(vec{u}cdotvec{w})+beta(vec{v}cdotvec{w}))
    • (vec{u}cdot(alphavec{v}+betavec{w}) = alpha(vec{uvec{v}})+beta(vec{u}cdotvec{w}))
  • 正定性:
    • (forallvec{u}inmathcal{A}.mathcal{V}, vec{u}nevec{0},vec{u}cdotvec{u}>0)
    • (vec{0}cdotvec{0} = 0)
  • 交换性:(vec{u}cdotvec{v} = vec{v}cdotvec{u})
  1. 长度平方: [vec{u}cdot vec{u}=||vec{u}||^2]
  2. 角度: [theta = cos^{-1}frac{vec{u}cdot vec{v}}{||vec{u}||||vec{v}||}]
  3. 投影: [vec{v}_{rVert}=frac{(vec{u}cdot vec{v})vec{u}}{vec{u}cdot vec{u}}]
  4. 法线: [vec{v}_{bot}=vec{u} - frac{(vec{u}cdot vec{v})vec{u}}{vec{u}cdot vec{u}}]
  5. 垂直: [vec{u} cdot vec{v}=0Longleftrightarrow vec{u}perpvec{v}]

向量积

性质:

  • 两个向量的叉积(vec{w}= vec{u}timesvec{v}是一个向量)
  • 两个向量的叉积垂直于这两个向量(dir(vec{u}timesvec{v})botvec{u},vec{v})
  • 两个向量的叉积的长度等于它们所构成的平行四边形的面积:(rVertvec{u}timesvec{v} = Area(vec{u}, vec{v})=rVertvec{u}rVertrVertvec{v}rVertsintheta)。如果(theta>0),面积为正,如果(theta<0),面积为负

  • 非交换性:(vec{u}timesvec{v}nevec{v}timesvec{u})
  • 分配性:(vec{u}times(vec{v}+vec{w})=(vec{u}timesvec{v})+(vec{u}timesvec{w}))
  • 分配性:((alphavec{u})timesvec{v}=vec{u}times(alphavec{v})=alpha(vec{u}timesvec{v}))
  • 平行律:(vec{u}rVertvec{v}Longleftrightarrowvec{u}timesvec{v}=vec{0})

体积、行列式和数量三重积

如果有三个线性无关的向量(vec{u},vec{v},vec{w})定义的一个平行六面体,则其体积为 [Vol(vec{u},vec{v},vec{w}) = Vol(vec{u},vec{w},vec{v})=dotsc=Vol(vec{w},vec{v},vec{u})] 顺序不重要。 TripleProduct

[ begin{aligned}Vol(vec{u},vec{v},vec{w}) &=basetimes height&定义\ &=rVertvec{u}rVertrVertvec{v}rVertsinpsitimesrVertvec{w}rVert |costheta|&三角几何\ &=rVertvec{u}rVertrVertvec{v}rVertsinpsicdotrVertvec{w_rVert}rVert&点积定义\ &=rVertvec{u}timesvec{v}rVertcdotrVertvec{w_rVert}rVert&叉积定义\ &=rVertvec{u}timesvec{v}cdotvec{w_rVert}rVert&长度定义\ &=rVertvec{u}timesvec{v}cdotvec{w}rVert\ end{aligned}]

表达式 [(vec{u}timesvec{v}cdotvec{w})] 通常用来表示三重数量积,就是行序(或列序)为(vec{u},vec{v},vec{w})的矩阵的行列式,表示为 [det(vec{u},vec{v},vec{w})] 行列式是有符号的体积 [Vol(vec{u},vec{v},vec{w})=|det(vec{u},vec{v},vec{w})|=sgn(vec{u},vec{v},vec{w})det(vec{u},vec{v},vec{w})]

与行列式、三重数量积和体积相关性质:

  • 只有当向量集({vec{u},vec{v},vec{w}})构成一个基底时,行列式(det(vec{u},vec{v},vec{w}))才是非零的。例如,三维空间中,如果三个向量不构成一个基底,那么他们只能生成一个面或一条线,而这两者都没有体积。
  • 只有当({vec{u},vec{v},vec{w}})的符号为正时,行列式(det(vec{u},vec{v},vec{w}))才是正的。
  • 循环改变向量的次序不会改变其行列式:
    • (det(vec{u},vec{v},vec{w}) = det(vec{w},vec{u},vec{v})= det(vec{v},vec{w},vec{u}))
  • 逆转向量的次序将改变行列式的符号,但不会改变其数量:
    • (det(vec{u},vec{v},vec{w}) = -det(vec{w},vec{v},vec{u})= -det(vec{v},vec{u},vec{w})=-det(vec{u},vec{w},vec{v}))
  • 翻转任何一个向量都将改变行列式的符号:
    • (det(vec{u},vec{v},vec{w}) = -det(-vec{u},vec{v},vec{w})= -det(vec{u},-vec{v},vec{w})=-det(vec{u},vec{v},-vec{w}))
  • 缩放向量将导致缩放行列式:
    • (det(cvec{u},vec{v},vec{w}) = det(vec{w},cvec{u},vec{v})= det(vec{v},vec{w},cvec{u})=cdet(vec{u},vec{v},vec{w}))
  • 右手标准正交空间的基底向量的行列式是单位行列式。

坐标系

仿射空间(mathcal{A})定义为点集(P)加上相关的向量空间(mathcal{V}),它们都具有相同的维数(n)。如果我们选取任意一点(mathcal{O}in mathcal{P})和一个基底(vec{v_1},vec{v_2},dotsc,vec{v_n}in mathcal{V}),那么这就构成了(mathcal{A})的一个坐标系。可以写为: [mathcal{F} = (vec{v_1},vec{v_2},dotsc,vec{v_n},mathcal{O})^T]

对于任何点(P和任何向量vec{u}),都存在一个唯一的点(Q = P+vec{u}),如果我们从(mathcal{F})中选择(mathcal{O})作为(P),那么任意点(Qin mathcal{P})都可以被定义为一个唯一的向量(vec{u}=a_1vec{v_1}+a_2vec{v_2}+dotsc+a_nvec{v_n})(mathcal{O})之和: [begin{aligned}Q &= vec{u}+mathcal{O}\&=a_1vec{v_1}+a_2vec{v_2}+dotsc+a_nvec{v_n}+mathcal{O}end{aligned}] (Q)的坐标为(a_1,a_2,dotsc , a_n)

笛卡尔坐标系

用角度和长度,我们可以在欧几里得空间定义一种特殊类型的坐标系——笛卡尔坐标系,其基底向量具有单位长度,并且相互垂直。这样的基底也称为标准正交。

仿射变换

一般的,我们将(T)(mathcal{A^n}mapstomathcal{B^m})叫做仿射变换(AffineTrasformation)[T(a_1P_1+a_2P_2+dotsc+a_nP_n)= a_1T(P_1)+ a_2T(P_2)+dotsc+ a_nT(P_n)] 其中(P_iin mathcal{A}且sum_{i=1}^na_i=1)。维数n和m不要求相等,但是(mleq n)

  1. 仿射变换保持相对比例
    [begin{aligned}T(R(t)) &= T((1-t)P+tQ)\ &=(1-t)T(P)+tT(Q)end{aligned}]
  2. 仿射变换(T)是关于仿射空间(mathcal{A})的线性变换,线性变换是保持线性组合的变换: [begin{aligned}T(vec{w}) &= T(vec{v_1}x_1+vec{v_2}x_2+dotsc+vec{v_n}x_n)\ &=T(vec{v_1}x_1)+T(vec{v_2}x_2)+dotsc+T(vec{v_n}x_n)\ &=x_1T(vec{v_1})+x_2T(vec{v_2})+dotsc+x_nT(vec{v_n})\ end{aligned}]
  3. 仿射变换保持点和向量的加法 [T(P+vec{v}) = T(P)+T(vec{v})]

综合以上性质,仿射变换(T)保持仿射坐标: [T(a_1P_1+a_2P_2+dotsc+a_nP_n+mathcal{O})= a_1T(P_1)+ a_2T(P_2)+dotsc+ a_nT(P_n)+T(mathcal{O})]

仿射映射的类型

仿射映射对向量的操作不包含位置相关的操作,允许旋转和缩放(均衡和非均衡)。 由于仿射变换同时针对(mathcal{A}.mathcal{P})(mathcal{A}.mathcal{V}),因此这种变化能表示与相对位置有关的变换:

  • 平移
  • 相对任意线或面的镜像或反射
  • 平行投影
  • 相对任意点的旋转
  • 相对任意线或面的剪切

仿射映射的合成

仿射映射的性质保证了不会离开仿射空间,因此可以将任意数量的仿射映射的组合看成一个更复杂的仿射映射。

重心坐标和单形

仿射空间中的点的坐标可以用向量空间中的基地向量和相对于(mathcal{F}的点mathcal{O})来定义: [mathcal{Q} = a_1vec{v_1}+a_2vec{v_2}+dotsc+a_nvec{v_n}+mathcal{O}] 另一种方法是使用所谓的“基底点”来定义:(P_0=mathcal{O},P_1=mathcal{O}+vec{v_1},dotsc,P_n=mathcal{O}+vec{v}) [mathcal{Q} = P_0a_0+P_1a_1+dotsc+P_na_n ] [1 = a_0+a_1+dotsc+a_n] 这可以确认为一个仿射组合,值(a_0,a_1,dotsc,a_n)叫做(mathcal{Q})关于(mathcal{F})的重心坐标。 仿射坐标和重心坐标

向量本身也能用重心坐标表示,设(a_0=-(a_1+a_2+dotsc+a_n)),则可以将向量写为 [vec{u} = a_0P_0+a_1P_1+dotsi+a_nP_n] 系数之和为0,而不像点一样是1."基底点"一叫做单形(simplex),这些特定的点加上基底向量叫做坐标系类似。 仿射映射可以将一个维的单形变换成一组非单形的n维点。当映射为投影时就是如此。

重心坐标和子空间

每一个单形都是由n+1个点组成,所以1维单形是线段,2维是三角形(定义一个面),3维是一个四面体(定义一个立方体)。

仿射无关

对于仿射坐标系来说,其基底向量必须是线性无关的。单形也存在类似的规定。基底点任何一点都不是其他点的仿射组合。如果一组基底点的单形坐标是线性无关的,则他们是仿射无关的。

假定(P_0,P_1, dotsi,P_n)是定义n维单形的n+1个点,并且(vec{v_i}=P_i-P_0(P_0=mathcal{O}))。如果n个向量(vec{v_1},vec{v_2},dotsc,vec{v_n})是线性无关的,那么点(P_0,P_1, dotsi,P_n)是仿射无关的。如果我们这样“退化”任何单形,我们可以得到位数少于1的空间,对应于“最近接的次阶”单形

矩阵、向量代数和变换

点和向量的矩阵表示

在3.3节我们说明了仿射坐标系可以用一组基底向量和一个原点来表示:
[mathcal{F} = (vec{v_1},vec{v_2},dotsi,vec{v_n},mathcal{O})^T] 其中任何的(vec{u}in mathcal{V})可表示为 [vec{u} = a_1vec{v_1}+a_2vec{v_2}+dotsi+a_nvec{v_n}tag{4.1}] 并且其中的任何点(Pinmathcal{P})(与坐标系的相关向量空间相联系的点的集合)都可以表示为 [P=a_1vec{v_1}+a_2vec{v_2}+dotsi+a_nvec{v_n}+mathcal{O}tag{4.2}]

由3.3节中定义的坐标公理指出,一个点与0相乘产生零向量,(0cdotmathcal{O}=vec{0}),((4.1))可改写为 [begin{aligned}vec{u} &= a_1vec{v_1}+a_2vec{v_2}+dotsi+a_nvec{v_n}+(0cdotmathcal{O})\ &=begin{bmatrix} a_1&a_2&cdots&a_n&0 end{bmatrix} begin{bmatrix} vec{v_1}\ vec{v_2}\ vdots\ vec{v_n}\ mathcal{O} end{bmatrix}\ &=begin{bmatrix} a_1&a_2&cdots&a_n&0 end{bmatrix} begin{bmatrix} v_{1,1} & v_{1,2} & cdots & v_{1,n} \ v_{2,1} & v_{2,2} & cdots & v_{2,n} \ vdots & vdots & ddots & vdots \ v_{n,1} & v_{n,2} & cdots & v_{n,n}\ mathcal{O_1} & mathcal{O_2} & cdots & mathcal{O_3}\ end{bmatrix} end{aligned}tag{4.3}]

如果上下文清晰地说明了仿射坐标系,则可以使用缩写形式(vec{u}=begin{bmatrix}a_1&a_2&cdots&a_n&0end{bmatrix})。 再次引用坐标公理,将((4.2))改写为 [begin{aligned}vec{u} &= a_1vec{v_1}+a_2vec{v_2}+dotsi+a_nvec{v_n}+mathcal{O}\ &=begin{bmatrix} a_1&a_2&cdo 大专栏  计算机图形学几何工具算法详解(1-4)ts&a_n&1 end{bmatrix} begin{bmatrix} vec{v_1}\ vec{v_2}\ vdots\ vec{v_n}\ mathcal{O} end{bmatrix}\ &=begin{bmatrix} a_1&a_2&cdots&a_n&1 end{bmatrix} begin{bmatrix} v_{1,1} & v_{1,2} & cdots & v_{1,n} \ v_{2,1} & v_{2,2} & cdots & v_{2,n} \ vdots & vdots & ddots & vdots \ v_{n,1} & v_{n,2} & cdots & v_{n,n}\ mathcal{O_1} & mathcal{O_2} & cdots & mathcal{O_3}\ end{bmatrix} end{aligned}tag{4.3}] 如果上下文清晰地说明了仿射坐标系,则可以使用缩写形式(P=begin{bmatrix}a_1&a_2&cdots&a_n&1end{bmatrix})。 仿射坐标系(mathcal{F})的基底向量和原点与仿射空间的其他向量和点没有什么不同,因此可以用矩阵来表示

[begin{bmatrix} v_{1,1} & v_{1,2} & cdots & v_{1,n}&0 \ v_{2,1} & v_{2,2} & cdots & v_{2,n}&0 \ vdots & vdots & ddots & vdots&vdots \ v_{n,1} & v_{n,2} & cdots & v_{n,n}&0\ mathcal{O_1} & mathcal{O_2} & cdots & mathcal{O_3}&1\ end{bmatrix}tag{4.5}]

在三维系统中,((4.5))中的矩阵为 [begin{bmatrix} 1&0&0&0\ 0&1&0&0\ 0&0&1&0\ 0&0&0&1\ end{bmatrix}] 显然,我们可以将方程((4.4))最后一行简单的写为 [p=begin{bmatrix} a_1&a_2&cdots&a_n&1 end{bmatrix}]

加法、减法和乘法

向量乘积

点积

由点积的定义可知: [vec{u}cdotvec{v} = rVertvec{u}rVertrVertvec{v}rVertcos{theta}] 如果有向量(vec{u}=u_1vec{i}+u_2vec{j}+u_3vec{k})(vec{v}=v_1vec{i}+v_2vec{j}+v_3vec{k}),则可以计算他们的点积如下 [begin{aligned} vec{u}cdotvec{v}=&begin{bmatrix}u_1&u_2&u_3&0end{bmatrix}cdotbegin{bmatrix}v_1&v_2&v_3&0end{bmatrix}\ =&(u_1vec{i}+u_2vec{j}+u_3vec{k})cdot (v_1vec{i}+v_2vec{j}+v_3vec{k})\ =&u_1v_1(vec{i}cdotvec{i})+u_1v_2(vec{i}cdotvec{j})+u_1v_3(vec{i}cdotvec{k})\ &+u_2v_1(vec{j}cdotvec{i})+u_2v_2(vec{j}cdotvec{j})+u_2v_3(vec{j}cdotvec{k})\ &+u_3v_1(vec{k}cdotvec{i})+u_3v_2(vec{k}cdotvec{j})+u_1v_1(vec{k}cdotvec{k})\ =&u_1v_1+u_2v_2+u_3v_3 end{aligned}] 矩阵表示 [vec{u}cdotvec{v}=begin{bmatrix}u_1&u_2&cdots&a_nend{bmatrix} begin{bmatrix} vec{v_1}\ vec{v_2}\ vdots\ vec{v_n}\ end{bmatrix}\] ### 叉积 #### 直接计算叉积 叉积的三个性质

  1. 长度 [rVertvec{u}timesvec{v}rVert = rVertvec{u}rVertrVertvec{v}rVertsin{theta}]
  2. 正交性 [vec{u}timesvec{v}perpvec{u}\vec{u}timesvec{v}perpvec{v}]
  3. 方向 [vec{i}timesvec{j}=vec{k}\vec{j}timesvec{i}=-vec{k}\ vec{j}timesvec{k}=vec{i}\vec{k}timesvec{j}=-vec{-}\ vec{k}timesvec{i}=vec{j}\vec{i}timesvec{k}=-vec{j}] 这是由于基底向量总是相互垂直并且遵守右手法则 有了上述基础,我们就可以证明叉积公式 [begin{aligned} vec{u}timesvec{v}=&begin{bmatrix}u_1&u_2&u_3&0end{bmatrix}cdotbegin{bmatrix}v_1&v_2&v_3&0end{bmatrix}\ =&(u_1vec{i}+u_2vec{j}+u_3vec{k})times (v_1vec{i}+v_2vec{j}+v_3vec{k})\ =&(u_2v_3-u_3v_2)vec{i}+(u_3v_1-u_1v_3)vec{j}+(u_1v_2-u_2v_1)vec{k}+vec{0}\ =&begin{bmatrix}u_2v_3-u_3v_2&u_3v_1-u_1v_3&u_1v_2-u_2v_1&0end{bmatrix} end{aligned}]

用矩阵乘法实现叉积

我们已知 [begin{aligned} vec{w} &= vec{u}timesvec{v}\ &=(u_2v_3-u_3v_2, u_3v_1-u_1v_3,u_1v_2-u_2v_1)\ end{aligned}] 可反转求出矩阵 [begin{aligned} vec{w} &= vec{u}timesvec{v}\ &=begin{bmatrix}u_1&u_2&a_3end{bmatrix}vec{v}\ &=begin{bmatrix}u_1&u_2&a_3end{bmatrix} begin{bmatrix} 0&-vec{v_3}&vec{v_2}\ vec{v_3}&0&-vec{v_1}\ -vec{v_2}&vec{v_1}&0\ end{bmatrix} end{aligned}]

张量积

向量代数中常见的另一个表达式是: [vec{t} = (vec{u}cdotvec{v})vec{w}tag{4.8}] 矩阵形式 [begin{aligned} vec{t} &= (vec{u}cdotvec{v})vec{w}\ &=begin{bmatrix}u_1&u_2&a_3end{bmatrix} begin{bmatrix} v_1w_1&v_1w_2&v_1w_3\ v_2w_1&v_2w_2&v_2w_3\ v_1w_1&v_1w_1&v_3w_3\ end{bmatrix} end{aligned}] 如果将上式计算出来,可以发现这种运算其实与方程((4.8))所表示的一样,这同时也揭示了这种运算的本职,它将向量(vec{u})变换为一个与(vec{w})平行的向量: [vec{t} = begin{bmatrix} (u_1v_1+u_2v_2+u_3v_3)w_1&(u_1v_1+u_2v_2+u_3v_3)w_2&(u_1v_1+u_2v_2+u_3v_3)w_3end{bmatrix}] 这种运算是(vec{u}对vec{v}和vec{w})的线性变换,因为它将向量变换为向量并保持线性组合。向量的次序很重要: [(vec{w}otimes vec{v})^T = vec{v}otimesvec{w} ]

正交运算符和正交点积

垂直运算符

向量(vec{v}^perp与vec{v})垂直 #### 垂直运算符的性质

  1. (vec{v}^perpperpvec{v})
  2. 线性
    1. ((vec{u}+vec{v})^perp = vec{u}^perp +vec{v}^perp)
    2. ((kvec{v})^perp = k(vec{v}^perp),forall k in mathbb{R})
  3. (rVertvec{v}^perprVert = rVertvec{v}rVert)
  4. (vec{v}^{perpperp} = (vec{v}^perp)^perp = -vec{v})
  5. (vec{v}^perp)是由(vec{v})逆时针旋转(90^o)所得的向量

垂直点运算

一个向量垂直的点积运算:(vec{u}^perpvec{v}) ##### 几何解释 Vertical dot product

我们有 [costheta = frac{vec{u}cdotvec{v}}{rVertvec{u}rVertrVertvec{v}rVert}tag{4.9}] 如图,如果基于它们之间的夹角来考虑(vec{u}^perp和vec{v})之间的关系 [cosphi = frac{vec{u}^perpcdotvec{v}}{rVertvec{u}^perprVertrVertvec{v}rVert}] 我们已经证明了(rVertvec{v}^perprVert = rVertvec{v}rVert),因此有 [cosphi = frac{vec{u}^perpcdotvec{v}}{rVertvec{u}rVertrVertvec{v}rVert}tag{4.10}] [vec{u}^perpcdotvec{v} = rVertvec{u}rVertrVertvec{v}rVertcosphitag{4.11}]

如果(theta+phi = pi/2),则(sintheta = cosphi)。从上图中看出确实有(theta+phi = pi/2),因此有 [vec{u}^perpcdotvec{v} = rVertvec{u}rVertrVertvec{v}rVertsintheta] 如果两个向量是规范的,就有 [vec{u}^perpcdotvec{v} = sinthetatag{4.12}]

这就非常清楚,垂直点运算不进反映了两个向量之间的夹角,而且还指出了它们之间家教的方向(即符号)。一般的点积仅仅指明了两个向量之间的角度,但不能说明方向(即角度的符号)

Vertical dot product and area
Vertical dot product and area

如图,根据定义,(sintheta=h/rVertvec{v}rVert),因此 [Area = rVertvec{u}rVertrVertvec{v}rVertsintheta] 结论:两个向量的垂直点积运算等于这两个向量所定义的三角形的有符号面积的两倍。从3.3.1节可知,两个向量的叉积(三维空间)与平行四边形的面积相关,因此我们可以看到,垂直点积可以被看成是三维叉积的二维模拟。

简单用分量表示垂直点积: [begin{aligned} vec{u}^perpcdotvec{v} &= -vec{u}_yvec{v}_x+vec{u}_xvec{v}_y\ &=vec{u}_xvec{v}-vec{u}_yvec{v}_x\ &=begin{vmatrix} u_x&u_y\ v_x&v_y\ end{vmatrix} end{aligned}] 如果我们把(vec{u}和vec{v})看成是嵌入平面z=0中的三维向量,那么可以看出,上式解释三元数积((vec{u}timesvec{v})cdotbegin{bmatrix}0&0&1end{bmatrix})。 正如3.3.1节中方程所示,定义了平面六面体的体积以三个向量作为行,多元组数量积与该矩阵的行列式相关。我们这里高度为1,因此该矩阵也与面积有关。

性质

几个垂直点积与一般点积不同的性质

  1. (vec{u}^perpcdotvec{v} = -vec{v}^perpcdotvec{u})。一般点积:(vec{u}cdotvec{v} = vec{v}cdotvec{u})
  2. (vec{v}^perpcdotvec{v}=0)。一般点积:(vec{v}cdotvec{v} = rVertvec{v}rVert^2)
  3. (vec{u}^perpcdotvec{v} = rVertvec{u}rVertrVertvec{v}rVertsintheta)。一般点积:(vec{u}^perpcdotvec{v} = rVertvec{u}rVertrVertvec{v}rVertcostheta)

仿射变换的矩阵表示

假设有两个仿射空间(mathcal{A}和mathcal{B}),坐标系分别是(mathcal{F_A}(vec{v_1},vec{v_2},dotsc,vec{v_n}, mathcal{O_A}))(mathcal{F_B}(vec{w_1},vec{w_2},dotsc,vec{w_n}, mathcal{O_B})),选择任意点(P),那么可以用((vec{v_1},vec{v_2},dotsc,vec{v_n}, mathcal{O_A}))将其位置描述为(begin{bmatrix}a_1&a_2&dotsi&a_n&1end{bmatrix})。如果我们有将(mathcal{A})映射到(mathcal{B})的变换(T),用符号(T(P))来表示对P进行变换得到的点。 [T(a_1vec{v_1}+a_2vec{v_2}+dotsi+a_nvec{v_n}+mathcal{O_A})tag{4.13}]

引用保持仿射组合的性质,((4.13))可以改为 [a_1T(vec{v_1})+a_2T(vec{v_2})+dotsi+a_nT(vec{v_n})+T(mathcal{O_A})tag{4.13}]

向量(T(v_i)和点T(mathcal{Q_A}))有一种相对于((vec{w_1},vec{w_2},dotsc,vec{w_n}, mathcal{O_B}))的表示((c_1,c_2,dotsi,c_n))(即坐标)。 [begin{aligned} T(P) &=begin{bmatrix}a_1&a_2&dotsi&a_n&1end{bmatrix}begin{bmatrix}T(vec{v_1})\T(vec{v_2})\vdots\T(vec{v_n})\T(vec{mathcal{O_A}})end{bmatrix}\ &=begin{bmatrix}a_1&a_2&dotsi&a_n&1end{bmatrix} begin{bmatrix} c_{1,1}vec{w_1}+c_{1,2}vec{w_2}+dotsi+c_{1,n}vec{w_n}\ c_{2,1}vec{w_1}+c_{2,2}vec{w_2}+dotsi+c_{2,n}vec{w_n}\ vdots\ c_{n,1}vec{w_1}+c_{n,2}vec{w_2}+dotsi+c_{n,n}vec{w_n}\ c_{n+1,1}vec{w_1}+c_{n+1,2}vec{w_2}+dotsi+c_{n+1,n}vec{w_n}+mathcal{O_B} end{bmatrix}\ &=begin{bmatrix}a_1&a_2&dotsi&a_n&1end{bmatrix} begin{bmatrix} c_{1,1}+c_{1,2}+dotsi+c_{1,n}&0\ c_{2,1}+c_{2,2}+dotsi+c_{2,n}&0\ vdots\ c_{n,1}+c_{n,2}+dotsi+c_{n,n}&0\ c_{n+1,1}+c_{n+1,2}+dotsi+c_{n+1,n}+1 end{bmatrix} begin{bmatrix} vec{w_1}\ vec{w_2}\ vdots\ vec{w_n}\ mathcal{O_B} end{bmatrix} end{aligned}tag{4.14}]

方程((4.14))最后一行的最右边的矩阵就是(mathcal{B})的坐标系,而且 [begin{aligned}begin{bmatrix}a_1&a_2&dotsi&a_n&1end{bmatrix} begin{bmatrix} c_{1,1}+c_{1,2}+dotsi+c_{1,n}&0\ c_{2,1}+c_{2,2}+dotsi+c_{2,n}&0\ vdots\ c_{n,1}+c_{n,2}+dotsi+c_{n,n}&0\ c_{n+1,1}+c_{n+1,2}+dotsi+c_{n+1,n}+1 end{bmatrix}\ =begin{bmatrix}a_1&a_2&dotsi&a_n&1end{bmatrix}T end{aligned}tag{4.15}]

就是一个点,我们把这个((n+1)times(n+1))的矩阵(T)称为变换(boldsymbol{T})的矩阵表示。 (T)的前n行就是(mathcal{A})的变换后的基底向量,最后一行就是变换后的原点。表示变换的矩阵有基底向量矩阵表示的坐标所定义。

基底变化/帧/坐标系统

[begin{aligned} P=begin{bmatrix}a_1&a_2&dotsi&a_n&1end{bmatrix}begin{bmatrix}vec{v_1}\vec{v_2}\vdots\vec{v_n}\vec{mathcal{O_A}}end{bmatrix} =begin{bmatrix}b_1&b_2&dotsi&b_n&1end{bmatrix}begin{bmatrix}vec{w_1}\vec{w_2}\vdots\vec{w_n}\vec{mathcal{O_B}}end{bmatrix} end{aligned}tag{4.16}]

两边拓展矩阵有 [begin{aligned} begin{bmatrix}a_1&a_2&dotsi&a_n&1end{bmatrix} begin{bmatrix} v_{1,1}&v_{1,2}&dotsi&v_{1,n}&0\ v_{2,1}&v_{2,2}&dotsi&v_{2,n}&0\ vdots&vdots&ddots&vdots&vdots\ v_{n,1}&v_{n,2}&dotsi&v_{n,n}&0\ mathcal{O_{A,1}}&mathcal{O_{A,2}}&dotsi&mathcal{O_{A,n}}&1\ end{bmatrix} =begin{bmatrix}b_1&b_2&dotsi&b_n&1end{bmatrix} begin{bmatrix} w_{1,1}&w_{1,2}&dotsi&w_{1,n}&0\ w_{2,1}&w_{2,2}&dotsi&w_{2,n}&0\ vdots&vdots&ddots&vdots&vdots\ w_{n,1}&w_{n,2}&dotsi&w_{n,n}&0\ mathcal{O_{B,1}}&mathcal{O_{B,2}}&dotsi&mathcal{O_{B,n}}&1\ end{bmatrix}\ end{aligned}tag{4.16}]

在3.2.3节,我们说明了任何向量(点)如何表示为一个基底向量的唯一仿射组合。应用于((vec{v_1},vec{v_2},dotsc,vec{v_n})和mathcal{O_A})

[begin{aligned} begin{bmatrix}a_1&a_2&dotsi&a_n&1end{bmatrix} begin{bmatrix} c_{1,1}&c_{1,2}&dotsi&c_{1,n}&0\ c_{2,1}&c_{2,2}&dotsi&c_{2,n}&0\ vdots&vdots&ddots&vdots&vdots\ c_{n,1}&c_{n,2}&dotsi&c_{n,n}&0\ c_{n+1,1}&c_{n+1,2}&dotsi&c_{n+1,n}&1\ end{bmatrix} begin{bmatrix} w_{1,1}&w_{1,2}&dotsi&w_{1,n}&0\ w_{2,1}&w_{2,2}&dotsi&w_{2,n}&0\ vdots&vdots&ddots&vdots&vdots\ w_{n,1}&w_{n,2}&dotsi&w_{n,n}&0\ mathcal{O_{B,1}}&mathcal{O_{B,2}}&dotsi&mathcal{O_{B,n}}&1\ end{bmatrix} =begin{bmatrix}b_1&b_2&dotsi&b_n&1end{bmatrix} begin{bmatrix} w_{1,1}&w_{1,2}&dotsi&w_{1,n}&0\ w_{2,1}&w_{2,2}&dotsi&w_{2,n}&0\ vdots&vdots&ddots&vdots&vdots\ w_{n,1}&w_{n,2}&dotsi&w_{n,n}&0\ mathcal{O_{B,1}}&mathcal{O_{B,2}}&dotsi&mathcal{O_{B,n}}&1\ end{bmatrix}\ end{aligned}tag{4.24}]

两边消除得矩阵因子得

[begin{aligned} begin{bmatrix}a_1&a_2&dotsi&a_n&1end{bmatrix} begin{bmatrix} c_{1,1}&c_{1,2}&dotsi&c_{1,n}&0\ c_{2,1}&c_{2,2}&dotsi&c_{2,n}&0\ vdots&vdots&ddots&vdots&vdots\ c_{n,1}&c_{n,2}&dotsi&c_{n,n}&0\ c_{n+1,1}&c_{n+1,2}&dotsi&c_{n+1,n}&1 end{bmatrix} =begin{bmatrix}b_1&b_2&dotsi&b_n&1end{bmatrix} end{aligned}]

向量几何和矩阵变换

本质而言,我们做的就是需要弄清楚如何操作原点和仿射空间的基底向量(实际上,可以是任意的线性无关的向量集)

标记法

一个((n+1)times(n+1))的仿射矩阵T可以被分解为三部分:

  1. (ntimes n)的左上角子矩阵A
  2. ((n+1)times 1)的右列,其形式为(begin{bmatrix}0&0&dotsi&1end{bmatrix}^T)
  3. (1times n)的底行,其形式总是为(vec{b}=begin{bmatrix}b_1&b_1&dotsi&b_nend{bmatrix})

这种分隔方式可以描述为 [begin{bmatrix} A&vec{0}^T\ vec{b}&1 end{bmatrix}]

一般将它称为分块矩阵

平移

[begin{aligned} T(P) &= begin{bmatrix}p_1&p_2&dotsi&p_n&1end{bmatrix} begin{bmatrix} T(vec{v_1})\ T(vec{v_2})\ vdots\ T(vec{v_n})\ T(mathcal{O})\ end{bmatrix}\ &=begin{bmatrix}p_1&p_2&dotsi&p_n&1end{bmatrix} begin{bmatrix} vec{v_1}\ vec{v_2}\ vdots\ vec{v_n}\ mathcal{O}+vec{u} end{bmatrix}\ &=begin{bmatrix}p_1&p_2&dotsi&p_n&1end{bmatrix}T begin{bmatrix} vec{v_1}\ vec{v_2}\ vdots\ vec{v_n}\ mathcal{O} end{bmatrix}\ end{aligned}]

根据矩阵乘法的定义,可得

[begin{aligned} T &=begin{bmatrix} 1&0&dotsi&0&0\ 0&1&dotsi&0&0\ vdots&0&1&0&0\ 0&0&dotsi&1&0\ u_1&u_2&dotsi&u_n&1\ end{bmatrix}\ &=begin{bmatrix} I&vec{0}^T\ vec{u}&1 end{bmatrix} end{aligned}]

旋转

简单情形

Simple rotation of coordinate system
Simple rotation of coordinate system

[T(vec{v_1})=begin{bmatrix}costheta&sintheta&0&0end{bmatrix}] [T(vec{v_2})=begin{bmatrix}-sintheta&costheta&0&0end{bmatrix}] [T(vec{v_3})=vec{v_3} = begin{bmatrix}0&0&1&0end{bmatrix}]

因此,可以简单的用基底向量和原点进行变换T后所得到的的映像来建立变换的矩阵: [T_z(theta)=begin{bmatrix} costheta&sintheta&0&0\ -sintheta&costheta&0&0\ 0&0&1&0\ 0&0&&1\ end{bmatrix}\]

对于另外两个轴,相似的 [T_x(theta)=begin{bmatrix} 1&0&0&0\ 0&costheta&sintheta&0\ 0&-sintheta&costheta&0\ 0&0&&1\ end{bmatrix}\] [T_y(theta)=begin{bmatrix} costheta&0&-sintheta&0\ 0&1&0&0\ sintheta&0&costheta&0\ 0&0&&1\ end{bmatrix}\]

一般旋转

如图,我们有如下推论: [begin{aligned} T(vec{v}_perp) &= T(vec{v})_perp\ &=(costheta)vec{v}_perp+(sintheta)vec{u}timesvec{v}_perp end{aligned}tag{4.25}] 以及 [begin{aligned} T(vec{v}_rVert) &= T(vec{v})_rVert\ &=vec{v}_rVert end{aligned}tag{4.26}]

由于(vec{v} = vec{v}_perp+vec{v_rVert}),并且T是线性变换,因此: [begin{aligned} T(vec{v}_perp) &= T(vec{v})_rVert+T(vec{v})_perp\ &=(vec{v}cdotvec{u})+(costheta)(vec{v}-(vec{v}cdotvec{u})vec{u})+(sintheta)(vec{u}times(vec{v}-(vec{v}cdotvec{u})vec{u}))\ &=(costheta)vec{v}+(1-costheta)(vec{v}cdotvec{u})vec{u}+(sintheta)(vec{u}timesvec{v}) end{aligned}]

该式有时称为旋转公式(rotation formula)或罗德里格斯公式(Rodriguez’s formula)。

最后,我们用该公司与向量的加法定义来推导点的旋转公式: [begin{aligned} T(P) &= Q+Y(P_Q)\ &=Q+T(vec{v}) &=Q+(costheta)vec{v}+(1-costheta)(vec{v}cdotvec{u})vec{u}+(sintheta)(vec{u}timesvec{v}) end{aligned}]

如果我们要得到上述公式的矩阵表示,就需要从这些方程中抽出向量来。设 [T_{vec{u},theta}=(costheta)I+(1-costheta)vec{u}otimesvec{u}+(sintheta)vec{u}]

为T的左上角子矩阵(回顾4.4.2节,(vec{u}是与vec{u})相关的点积的反对称矩阵)。那么我们的总变换为 [begin{bmatrix} T_{vec{u},theta}&vec{0}^T\ Q-QT_{vec{u},theta}&1 end{bmatrix}]

子矩阵(T_{vec{u},theta}是vec{v})的线性变换。底行只对点有影响,以为向量的矩阵表示的最后一个分量为0,如果Q不是原点,那么我们必须将其平移Q与其旋转所得点之间的距离。

缩放

简单缩放

我们可以建立一个矩阵,它的各行包含了变换后的基底向量和原点,实现了相对于原点的简单缩放。 [begin{aligned}T_{s_x,s_y,s_z}&=begin{bmatrix}T(vec{v_1})&T(vec{v_2})&T(vec{v_3})&T(mathcal{O})end{bmatrix}\ &=begin{bmatrix} s_x&0&0&0\ 0&s_y&0&0\ 0&0&s_z&0\ 0&0&0&1\ end{bmatrix} end{aligned}]

在上述方法中,相对于不是原点的点Q的均衡缩放需要如下三个步骤:

  1. 平移到原点(即实现平移((begin{bmatrix}0&0&0end{bmatrix}-Q)))
  2. 应用上述相对于原点的缩放
  3. 做与第一步相反的平移

一般缩放

均衡缩放(uniform scaling)

向量缩放 [T(vec{v}) = svec{v}tag{4.27}] 点的缩放 [begin{aligned} T(P) &= Q+T(vec{v})\ &=Q+s(P_Q)\ &=sP+(1-s)Q end{aligned}tag{4.28}]

将这些向量代数方程转化为矩阵是很直接的,缩放向量,只需要考虑方程(4.27)需要填充左上角的子矩阵: [T_s = sI]

对于点的缩放,我们需要用方程((4.28))的最右边来填充底行,即矩阵的平移部分,由此得到的结果矩阵 [T_{s,Q} = begin{bmatrix} T_{s}&vec{0}^T\ (1-s)Q&1 end{bmatrix}]

非均衡缩放(nonuniform scaling)

(vec{v}投影到vec{u})代入垂直分量和平行分量的定义,可得 [begin{aligned} T(vec{v}) &= T(vec{v}_perp)+T(vec{v}_rVert)\ &=vec{v}_perp+svec{v}_rVert\ &=vec{v}-(vec{v}cdotvec{u})vec{u}+s(vec{v}cdotvec{u})vec{u}\ &=vec{v}+(s-1)(vec{v}cdotvec{u})vec{u} end{aligned}tag{4.29}]

对于点 [begin{aligned} T(P) &= Q+T(vec{v})\ &=Q+T(P-Q)\ &=P+(s-1)((P-Q))cdotvec{u})vec{u} end{aligned}tag{4.30}]

实现线性变换的左上角(ntimes n)子矩阵,只需从((4.29))中减去(vec{v}): [T_{s,vec{u}} = I-(1-s)(vec{u}otimesvec{u})]

对于点的非均衡缩放,从方程((4.30))中抽取P,得到我们需要的矩阵: [T_{s,Q,vec{u}} = begin{bmatrix} T_{s,vec{u}}&vec{0}^T\ (1-s)(Qcdotvec{u})vec{u}&1 end{bmatrix}tag{4.31}]

反射

简单反射

相对于通过原点的基底向量,反转其他基底向量。 ##### 一般反射

根据向量加法的定义 [begin{aligned} T(vec{v}) &= T(vec{v}_perp)+T(vec{v}_rVert)\ &=vec{v}_perp-vec{v}_rVert\ &=vec{v}-2vec{v}_rVert\ &=vec{v}-2(vec{v}cdothat{d}_perp)hat{d}^perp end{aligned}tag{4.32}]

利用点与向量的加法定义 [begin{aligned} T(P) &=Q+T(vec{v})\ &=Q+T(P-Q)\ &=P-2((P-Q))cdothat{d}_perp)hat{d}^perp end{aligned}]

简单的从((4.32))中抽取(vec{v})

[T_{hat{d}} = begin{bmatrix}I-2(hat{d}^perp otimes hat{d}^perp)end{bmatrix}]

对于平移部分像以前一样求得,从而得到一个完整的反射矩阵 [T_{hat{d},Q} = begin{bmatrix} T_{hat{d}}&vec{0}^T\ (2(Qcdothat{d}^perp)hat{d}^perp&1 end{bmatrix}]

我们选择将(vec{v})投影到(hat{d}^perp)上,而不是(hat{d})上。原因是,如果我们的反射所相对的平面是由其上一点Q和一条法线(hat{n})所表示的,那么我们就可以直接将其扩展到三维空间

三维空间的反射矩阵 [T_{hat{n},Q} = begin{bmatrix} T_{hat{n}}&vec{0}^T\ (2(Qcdothat{n})hat{n}&1 end{bmatrix}]

剪切

简单剪切

(vec{v_1}为x轴的剪切T_{xy,theta},x轴没有变换) (vec{v_2}为y轴时的剪切T_{xy,theta}),由于我们假设使用标准的欧几里得基底,因此(rVertvec{v_2}rVert=1),因此我们可以简单地应用三角几个来推导(vec{v_2}的剪切)[T_{xy,theta}(vec{v_2}) = begin{bmatrix}tantheta&1&0end{bmatrix}]

由于变换不影响原点 [T(mathcal{O}) = mathcal{O}] 所以变换矩阵为 [begin{aligned} T_{xy,theta}&=begin{bmatrix}T(vec{v_1})\T(vec{v_2})\T(O)end{bmatrix}\ &=begin{bmatrix} 1&0&0\ tantheta&1&0\ 0&0&1 end{bmatrix} end{aligned}]

在三维空间中存在6中剪切。如果我们设 [H_{etagamma} = tantheta_{etagamma}]

其中(eta)是指剪切所改变的坐标,(gamma)是指进行剪切的坐标那么可以建立如下方法,已说明获取需要的剪切方向的剪切因子定位: [begin{aligned} begin{bmatrix} 1&H_{yx}&H_{zx}&0\ H_{xy}&1&H_{zy}&0\ H_{xz}&H_{yz}&1&0\ 0&0&0&1\ end{bmatrix} end{aligned}]

这些(H)因子中只有一个应该为非零,两个或多个的剪切组合必须通过求得每一个剪切矩阵并将这些矩阵相乘在一起来实现。

一般剪切

对于任何点P,设(P^prime)为其在S上的正交投影,并建立点(P^{primeprime} = P+tvec{v}),使得(angle P^{primeprime}P^primeP = theta),如果我们将剪切应用于P,可以得到(P^{primeprime}),变换为 [T_{Q,hat{n}, vec{v},theta}=begin{bmatrix} 1+tantheta(hat{n}otimes vec{v})&vec{o}^T\ -(Qcdot hat{n})vec{v}&1 end{bmatrix}]

注意到该矩阵的行列式为1,因此这种剪切变换保持体积不变((-pi /2<therefore<pi/2)

一般的三维剪切矩阵可以沿不同的线来建立。向量(hat{v}和hat{n}(第三个基底vec{v}timesvec{n}))以及点Q定义了一个仿射坐标系。如果我们有点(P=Q+y_1hat{n}+y_2hat{v}+y_3(vec{v}timesvec{n}))那么,剪切操作可以将该点映射为 [begin{aligned} T(P) &= T(Q)+y_1T(hat{n})+y_2T(hat{v})+y_3T(vec{v}timesvec{n})\ &=Q+y_1(hat{n}+tanthetahat{v})+y_2hat{v}+y_3(hat{v}timeshat{n})\ &=Q+y_1hat{n}+(y_1tantheta+y_2)hat{v}+y_3(hat{v}timeshat{n})\ end{aligned}]

与仿射坐标系相关的矩阵为 [begin{bmatrix} 1&tantheta&0&0\ 0&1&0&0\ 0&0&1&0\ Q_x&Q_y&Q_Z&1 end{bmatrix}]

左上方的矩阵(boldsymbol{H})为二维空间的(T_{xy,theta})(基底向量(vec{v})相当于该坐标系的y轴)

利用标准的欧几里得基底,如果我们有旋转矩阵 [boldsymbol{R}=begin{bmatrix}hat{n}\hat{v}\hat{n}timeshat{v}end{bmatrix}] 以及 [vec{y}=begin{bmatrix}y_1&y_2&y_3end{bmatrix}] 那么 [P = Q+vec{y}R] 且有 [begin{aligned} T(P) &= Q+vec{y}boldsymbol{HR} &=Q+(P-!)boldsymbol{R}^Tboldsymbol{HR} end{aligned}] 矩阵T的变换矩阵为 [T_{hat{n},hat{v},Q,theta} = begin{bmatrix} boldsymbol{R}^Tboldsymbol{HR}&vec{0}^T\ Q(I_3-boldsymbol{R}^Tboldsymbol{HR})&1 end{bmatrix}]

投影

正射投影

[begin{aligned} T(vec{v}) &= vec{v}_perp\ &=vec{v}-(vec{v}cdotvec{u})vec{u} end{aligned}tag{4.33}] 类似的点P的变化 [begin{aligned} T(P) &= Q+T(vec{v})\ &=P-((P-Q)cdotvec{u})vec{u} end{aligned}tag{4.34}]

((4.33))析出因子(vec{v}) [T_{hat{u}} = I-(hat{u}otimeshat{u})]((4.34))剔除点P [T_{hat{u},Q} = begin{bmatrix} T_{hat{u}}&vec{0}^T\ Qcdothat{u}&1 end{bmatrix}]

斜轴投影

投影方向(hat{w}) [T(vec{v}) = vec{v} - alphahat{w}tag{4.35}] 显然,需要计算的是(alpha) [frac{rVertvec{v}_rVertrVert}{rVerthat{w}_rVertrVert}= frac{rVert(alphavec{v})_rVertrVert}{rVerthat{w}_rVertrVert}=alpha] 可以用点积的定义将其改写为 [alpha = frac{vec{v}cdothat{u}}{hat{w}cdothat{u}}tag{4.36}]

代入((4.35)) [T(vec{v}) = vec{v}-frac{vec{v}cdothat{u}}{hat{w}cdothat{u}}hat{w}tag{4.37}]

点变换的公式: [begin{aligned} T(P) &= Q+T(vec{v})\ &=P-frac{((P-Q)cdothat{u})hat{w}}{hat{w}cdothat{u}} end{aligned}tag{4.38}] 从方程((4.37))抽出(vec{v}) [T_{hat{u}, hat{w}} = I-frac{(hat{u}otimeshat{w})}{hat{w}cdothat{u}}]

完整矩阵如下 [T_{hat{u},Q, hat{w}} =begin{bmatrix} T_{hat{u},hat{w}}&vec{0}^T\ frac{Qcdothat{u}}{hat{w}cdothat{u}}hat{w}&1 end{bmatrix}]

透视投影

透视投影不是一张仿射变换,然而透视投影确实保持了一种称为交比(cross-ratios)的性质。 交比的定义如下:给定4个共线的点(P,R_1,R_2,Q)其交比为 [CrossRatio(P,R_1,R_2,Q) = frac{bar{PR_1}/bar{R_1Q}}{bar{PR_2}/bar{R_2Q}}]

如图,保持交比意味着下式成立 [CrossRatio(P, R_1, R_2, Q) = CrossRatio(T(P), T(R_1), T (R_2), T(Q))]

如图, [T(P) = P+alpha(S-P)tag{4.39}] [T(P)-Q = (P-Q)+alpha(S-P)]

该向量与法向量垂直,因此有 [hat{u}cdot(P-Q)+alphahat{u}cdot(S-P)] 求解 [alpha=frac{hat{u}cdot(Q-P)}{hat{u}cdot(S-P)}tag{4.40}]((4.40)代入(4.39)),并做一点向量运算 [begin{aligned} T(P) &= P+frac{hat{u}cdot(Q-P)}{hat{u}cdot(S-P)}(S-P)\ &=frac{((S-Q)cdot hat{u})P+((Q-P)cdothat{u})S}{(S-P)cdothat{u}} end{aligned}]

其变换矩阵为 [T_{hat{u},Q, S} =begin{bmatrix} ((S-Q)cdothat{u})I-hat{u}otimes S&-hat{u}^T\ (Qcdothat{u})S&Scdothat{u} end{bmatrix}]

变换法向量

曲面的法线是与曲面相切的(线性无关的)向量的叉积: [vec{n} = vec{u}timesvec{v}] 变换后的曲面法线为(vec{m} = T(vec{u})timesT(vec{v}))。然而(vec{m})不一定就是变换后的结果(T(vec{n})),(T(vec{u})timesT(vec{v})ne T(vec{u})times T(vec{v})),跟一般的二者不一定平行。

任何切线向量(vec{u})的垂直向量(vec{n})都可以表示为 [vec{u}cdotvec{v} = vec{u}vec{v}^T = 0] 变换后的法线垂直于变换后的切线: [begin{aligned} 0&=vec{u}vec{n}^T\ &=vec{u}TT^{-1}vec{n}^T\ &=(vec{u}T)(vec{n}(T^{-1})^T)^T\ &=T(vec{u})cdot(vec{n}(T^{-1})T) end{aligned}]

因此变换后的曲面的法线向量为(vec{m} = vec{n}(T^{-1})^T),(T{-1})T叫做T的逆转置矩阵。即使(vec{n})是单位长度的,向量(vec{m} = vec{n}(T^{-1})^T)也不一定是单位长度的。

猜你喜欢

转载自www.cnblogs.com/liuzhongrong/p/12390833.html
今日推荐