iOS CGAffineTransform詳解

weixin_34185560發表於2017-01-03

UIView的transform屬性是一個CGAffineTransform型別,用於在二維空間做旋轉,縮放和平移。CGAffineTransform是一個可以和二維空間向量(例如CGPoint)做乘法的3X2的矩陣。稱為仿射變換,“仿射”的意思是無論變換矩陣用什麼值,圖層中平行的兩條線在變換之後任然保持平行”。

官方定義:

struct CGAffineTransform {
CGFloat a, b, c, d;
CGFloat tx, ty;
};
雖然結構體中只有a,b,c,d,tx,ty 6個引數,但其實還有3個固定的引數[0,0,1]來組成3x3的矩陣。
如下圖所示:


x' = ax + cy + tx y' = xb + yd + ty

向量的變換

影像上每個點的位置可以看成一個向量n維向量,取決於影像的空間。所以對影像的變換可以等價於對向量的變換,研究向量的變換可以讓我們更直觀的瞭解影像變換的原理 1. 向量的平移(對座標系內某點得移動)
1814883-4717dba9d5189435.png
向量的平移

2. 向量的縮放 X飯方向縮放a倍,Y方向縮放b倍,則有
1814883-f0585c572818fac8.png
向量的縮放
3. 向量的旋轉 二位平面的向量旋轉,即可以表示為三維空間的向量繞Z軸的旋轉 如圖:
1814883-ff9143cded685aaa.jpg
向量的縮放
將向量x在平面X-Y內繞原點旋轉B,假設向量x的模為R,則根據三角函式的知識得
1814883-cdc29b90769621df.png
向量旋轉推倒

,旋轉後的向量為
1814883-b4206e0d39e986ac.png
旋轉後的向量為
用矩陣表達即為
1814883-5b142e9a4d604c7a.png
旋轉後的矩陣表示式

齊次座標

齊次座標就是將一個原本是n維的向量用一個n+1維向量來表示,例如,二維點(x,y)的齊次座標表示為(hx,hy,h)。由此可以看出,一個向量的齊次表示是不唯一的,齊次座標的h取不同的值都表示的是同一個點,比如齊次座標(8,4,2)、(4,2,1)表示的都是二維點(4,2)。許多圖形應用涉及到幾何變換,主要包括平移、旋轉、縮放。以矩陣表示式來計算這些變換時,平移是矩陣相加,旋轉和縮放則是矩陣相乘,綜合起來可以表示為p' = p *m1+ m2(注:因為習慣的原因,實際使用時一般使用變化矩陣左乘向量)(m1旋轉縮放矩陣, m2為平移矩陣, p為原向量 ,p'為變換後的向量)。引入齊次座標的目的主要是合併矩陣運算中的乘法和加法

所以2D變換的矩陣,就是剛開始的那個3行3列的矩陣。對上述方法進行擴充,我們很容易得出三維空間的變換矩陣
1814883-9f793fcefa5599f8.png
3d_transform

identity矩陣
/* The identity transform: [ 1 0 0 1 0 0 ]. */CG_EXTERN const CGAffineTransform CGAffineTransformIdentity CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

identity矩陣可以表示為


1814883-b585053a5b78c1af

CGAffineTransformMakeTranslation方法
/* Return a transform which translates by `(tx, ty)': t' = [ 1 0 0 1 tx ty ] */CG_EXTERN CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

CGAffineTransformMakeTranslation
是一個進行平移的方法,根據註釋得到的矩陣為


1814883-eb15ec80c6b4f574

CGAffineTransformMakeScale方法
/* Return a transform which scales by `(sx, sy)': t' = [ sx 0 0 sy 0 0 ] */CG_EXTERN CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

CGAffineTransformMakeScale
是一個進行縮放的方法,根據註釋得到的矩陣為


1814883-100bee9557a13cec

CGAffineTransformMakeRotation方法
/* Return a transform which rotates by `angle' radians: t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] */CG_EXTERN CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

CGAffineTransformMakeRotation
是一個進行旋轉的方法,根據註釋得到的矩陣為


1814883-2a8d5149f13fb12c

錯切

1814883-35e220cf2323e2fa

相關文章