仿射變換Transform

簡介

  • CGAffineTransform
    CGAffineTransformCoreGraphics的結(jié)構(gòu)體靡砌,定義在二維空間上完成UIView的平移已脓,旋轉(zhuǎn),縮放等效果的實現(xiàn)通殃。
  • CATransform3D
    CATransform3DCoreAnimation的結(jié)構(gòu)體度液,是用來做更復(fù)雜的關(guān)于CALayer的3D操作。

CGAffineTransform

結(jié)構(gòu)體
struct CGAffineTransform {
  CGFloat a, b, c, d;
  CGFloat tx, ty;
};  

為了把二維圖形的變化統(tǒng)一在一個坐標(biāo)系里画舌,引入了齊次坐標(biāo)的概念堕担,即把一個圖形用一個三維矩陣表示,其中第三列總是(0,0,1)骗炉,用來作為坐標(biāo)系的標(biāo)準(zhǔn)照宝。所以所有的變化都由前兩列完成。


CGAffineTransformIdentity表示一個原始狀態(tài)的CGAffineTransform句葵。

計算公式:

矩陣算法公式:

例子:
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
view.transform = CGAffineTransformMake(0.2, 0, 0, 1, 0, 0);
// view的frame從原來的(100, 100, 100, 100)變成了(140, 100, 20, 100)
// x` = ax + cy + tx = 0.2 * 100 + 0 * 100 + 0 = 20
// y` = bx + dy + ty = 0 * 100 + 1 * 100 + 0 = 100

總結(jié)

  • x按照a值進(jìn)行了比例縮放厕鹃,y按照d的值進(jìn)行比列縮放,最重要的是縮放的過程中view的中心點point是不會改變的乍丈。
  • x會跟著c的值進(jìn)行拉伸(view的寬度是跟著改變)剂碴,y會跟著b的值進(jìn)行拉伸(view的高度跟著改變),要注意到的是c和b的值改變不會影響到view的中心點point的改變轻专。
  • x會跟著tx進(jìn)行x做表平移忆矛,y會跟著ty進(jìn)行平移。這里的中心點point是跟著變換的请垛。
CGAffineTransform的使用
  • 初始化
    // 保持原始狀態(tài)初始化
    CGAffineTransform transfrom = CGAffineTransformIdentity;
    // 變換初始化
    CGAffineTransformMake(CGFloat a, CGFloat b, CGFloat c, CGFloat d, CGFloat tx, CGFloat ty);
    
  • 平移
    // 根據(jù)本身的transform進(jìn)行平移
    CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty)
    // 根據(jù)本身的transform后者另外的transform進(jìn)行平移
    CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx,CGFloat ty)
    
  • 縮放
    // 根據(jù)本身的transform進(jìn)行縮放
    CGAffineTransformMakeScale(CGFloat sx,CGFloat sy)
    // 根據(jù)本身的transform后者另外的transform進(jìn)行縮放
    CGAffineTransformScale(CGAffineTransform t,CGFloat sx,CGFloat sy)
    
  • 旋轉(zhuǎn)
    // 根據(jù)本身的transform進(jìn)行旋轉(zhuǎn) angle 旋轉(zhuǎn)的角度 
    CGAffineTransformMakeRotation(CGFloat angle)
    // 根據(jù)本身的transform后者另外的transform進(jìn)行旋轉(zhuǎn)
    CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)
    
  • 合并
    // 兩個transform合并起來
    CGAffineTransformConcat(CGAffineTransform t1,CGAffineTransform t2)
    
  • 評測
    // 查看是不是默認(rèn)的transform
    Bool CGAffineTransformIsIdentity(CGAffineTransform t)
    // 比較兩個transform是否相等
    BOOl CGAffineTransformEqualToTransform(CGAffineTransform t1,CGAffineTransform t2)               
    
  • 仿射矩陣應(yīng)用
    // 得到新的中心 CGPoint
    CGPointApplyAffineTransform(CGPoint point,CGAffineTransform t)
    // 得到新的size CGSize
    CGSizeApplyAffineTransform(CGSize size,CGAffineTransform t)
    // 得到新的rect CGRect
    CGRectApplyAffineTransform(CGRect rect,CGAffineTransform t)
    

CATransform3D

struct CATransform3D {
    CGFloat m11(x縮放), m12(y切變), m13(旋轉(zhuǎn)), m14();
    CGFloat m21(x切變), m22(y縮放), m23(和m32一起決定x軸的旋轉(zhuǎn)), m24();
    CGFloat m31(和m13一起決定y軸的旋轉(zhuǎn)),m32(和m23一起決定x軸的旋轉(zhuǎn)), m33(z縮放), m34(透視效果催训,要操作的這個對象要有旋轉(zhuǎn)的角度,否則沒有效果宗收。正直/負(fù)值都有意義);
    CGFloat m41(x平移), m42(y平移), m43(z平移), m44(初始為1);
};
CATransform3D的使用
  • 初始化
    CATransform3D transfrom = CATransform3DIdentity;
    
  • 平移
    // 在x軸方向上平移x單位,在y軸方向上平移y單位,在z軸方向上平移z單位
    CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloat tz)
    //在某個transform3D變換的基礎(chǔ)上進(jìn)行平移變換漫拭,t是上一個transform3D,其他參數(shù)同上
    CATransform3D CATransform3DTranslate (CATransform3D t, CGFloat tx, CGFloat ty, CGFloat tz);
    
  • 縮放
    //x混稽,y采驻,z分別對應(yīng)x軸,y軸匈勋,z軸的縮放比例
    CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz);
    //在一個transform3D變換的基礎(chǔ)上進(jìn)行縮放變換礼旅,其他參數(shù)同上
    CATransform3D CATransform3DScale (CATransform3D t, CGFloat sx, CGFloat sy, CGFloat sz);
    
  • 旋轉(zhuǎn)
    // 實現(xiàn)以初始位置為基準(zhǔn),在x軸,y軸,z軸方向上逆時針旋轉(zhuǎn)angle弧度(弧度=π/180×角度,M_PI弧度代表180角度),x,y,z三個參數(shù)只分是否為0
    CATransform3DMakeRotation (CGFloat angle, CGFloat x, CGFloat y, CGFloat z)
    //在一個transform3D的基礎(chǔ)上進(jìn)行旋轉(zhuǎn)變換,其他參數(shù)如上
    CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle, CGFloat x, CGFloat y, CGFloat z);
    
  • 合并
    // 疊加3D仿射效果
    CATransform3DConcat (CATransform3D a, CATransform3D b)
    

CATransform3D和CGAffineTransform相互轉(zhuǎn)換

//將一個CGAffineTransform轉(zhuǎn)化為CATransform3D
CATransform3D CATransform3DMakeAffineTransform (CGAffineTransform m);

//判斷一個CATransform3D是否可以轉(zhuǎn)換為CGAffineTransform
bool CATransform3DIsAffine (CATransform3D t);

//將CATransform3D轉(zhuǎn)換為CGAffineTransform
CGAffineTransform CATransform3DGetAffineTransform (CATransform3D t);

景深

在默認(rèn)情況下洽洁,系統(tǒng)采用正交投影痘系,對于3D形變實際上是看不到3D效果的,在CATransform3D結(jié)構(gòu)體中有一個m34便允許我們將正交投影修改為有近大遠(yuǎn)小立體效果的透視投影饿自,其中m34 = -1.0/z,這個z為觀察者與控件之間的距離汰翠。

m34必須在賦值transform之前設(shè)置才會生效
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末临谱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奴璃,更是在濱河造成了極大的恐慌,老刑警劉巖城豁,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苟穆,死亡現(xiàn)場離奇詭異,居然都是意外死亡唱星,警方通過查閱死者的電腦和手機雳旅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來间聊,“玉大人攒盈,你說我怎么就攤上這事“チ瘢” “怎么了型豁?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尚蝌。 經(jīng)常有香客問我迎变,道長,這世上最難降的妖魔是什么飘言? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任衣形,我火速辦了婚禮,結(jié)果婚禮上姿鸿,老公的妹妹穿的比我還像新娘谆吴。我一直安慰自己,他們只是感情好苛预,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布句狼。 她就那樣靜靜地躺著,像睡著了一般碟渺。 火紅的嫁衣襯著肌膚如雪鲜锚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天苫拍,我揣著相機與錄音芜繁,去河邊找鬼。 笑死绒极,一個胖子當(dāng)著我的面吹牛骏令,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播垄提,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼榔袋,長吁一口氣:“原來是場噩夢啊……” “哼周拐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凰兑,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤妥粟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吏够,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勾给,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年锅知,在試婚紗的時候發(fā)現(xiàn)自己被綠了播急。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡售睹,死狀恐怖桩警,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昌妹,我是刑警寧澤捶枢,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站飞崖,受9級特大地震影響柱蟀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚜厉,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一长已、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昼牛,春花似錦术瓮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伶椿,卻和暖如春辜伟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脊另。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工导狡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人偎痛。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓旱捧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子枚赡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容