iOS CGAffineTransform詳解
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. 向量的平移(對座標系內某點得移動)齊次座標
齊次座標就是將一個原本是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列的矩陣。對上述方法進行擴充,我們很容易得出三維空間的變換矩陣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矩陣可以表示為
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
是一個進行平移的方法,根據註釋得到的矩陣為
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
是一個進行縮放的方法,根據註釋得到的矩陣為
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
是一個進行旋轉的方法,根據註釋得到的矩陣為
錯切
相關文章
- iOS 仿射變換(CGAffineTransform)iOSORM
- CGAffineTransform二維檢視旋轉、縮放、平移變換詳解ORM
- iOS開發UI篇--仿射變(CGAffineTransform)使用小結iOSUIORM
- iOS打包詳解iOS
- iOS GCD詳解iOSGC
- iOS RunLoop詳解iOSOOP
- iOS Runtime詳解iOS
- iOS訂閱詳解iOS
- iOS UIButton之UIButtonType詳解iOSUI
- iOS設計模式詳解iOS設計模式
- iOS KVC和KVO詳解iOS
- iOS UIButton之UIEdgeInsets詳解iOSUI
- iOS之runtime詳解api(二)iOSAPI
- iOS之runtime詳解api(四)iOSAPI
- iOS之runtime詳解api(三)iOSAPI
- 【iOS基礎】KVC / KVO詳解iOS
- iOS之runtime詳解api(一)iOSAPI
- iOS中的Reference Counting詳解iOS
- iOS開發之 Autolayout 詳解iOS
- iOS 多執行緒詳解iOS執行緒
- iOS12 Siri Shortcuts詳解iOS
- iOS執行器performSelector詳解iOSperformSelector
- iOS記憶體管理詳解iOS記憶體
- 一文弄懂CGAffineTransform和CTMORM
- iOS自動佈局——Masonry詳解iOS
- iOS 中的 GCD 實現詳解iOSGC
- iOS APP簽名機制詳解iOSAPP
- iOS - 靜態庫.a 和 framework 詳解iOSFramework
- AppInspector-iOS真機功能詳解APPiOS
- iOS多執行緒:NSOperation詳解iOS執行緒
- iOS多執行緒:GCD詳解iOS執行緒GC
- 【IOS開發初學者】UINavigationController詳解iOSUINavigationController
- iOS Push詳述,瞭解一下?iOS
- iOS多執行緒詳解:概念篇iOS執行緒
- iOS 靜態庫詳解與開發iOS
- iOS網路層詳解和優化iOS優化
- iOS Memory 記憶體詳解 (長文)iOS記憶體
- iOS 開發:『Runtime』詳解(二)Method SwizzlingiOS
- iOS底層系統:BSD層詳解iOS