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 RunLoop詳解iOSOOP
- iOS GCD詳解iOSGC
- iOS UIScreen詳解iOSUI
- iostat詳解iOS
- 【iOS開發】iOS 動畫詳解iOS動畫
- iOS Runtime詳解iOS
- iOS 單例詳解iOS單例
- iOS架構詳解iOS架構
- iostat命令詳解iOS
- iOS訂閱詳解iOS
- axios的用法詳解iOS
- iOS設計模式詳解iOS設計模式
- IO命令iostat詳解iOS
- iOS KVC和KVO詳解iOS
- iOS 單例模式詳解iOS單例模式
- iOS之StatusBar詳解iOS
- 【iOS基礎】KVC / KVO詳解iOS
- iOS12 Siri Shortcuts詳解iOS
- iOS開發之 Autolayout 詳解iOS
- iOS記憶體管理詳解iOS記憶體
- IOS SDWebImage實現原理詳解iOSWeb
- iOS11適配詳解iOS
- iOS 多執行緒詳解iOS執行緒
- nagios配置過程詳解iOS
- Nagios配置檔案詳解iOS
- vmstat與iostat詳解(zt)iOS
- iOS多執行緒:GCD詳解iOS執行緒GC
- iOS 中的 GCD 實現詳解iOSGC
- iOS之runtime詳解api(一)iOSAPI
- iOS之runtime詳解api(三)iOSAPI
- iOS之runtime詳解api(二)iOSAPI
- iOS之runtime詳解api(四)iOSAPI
- iOS Memory 記憶體詳解 (長文)iOS記憶體
- iOS執行器performSelector詳解iOSperformSelector