CGAffineTransform.h類的學(xué)習(xí)和原理講解

第一次寫ios相關(guān)技術(shù)博客旬薯,所以先寫個(gè)簡(jiǎn)單的,寫的不好大家多多提意見适秩。
想學(xué)好這個(gè)類绊序,我感覺最好還是從理論上弄明白什么二維圖形到底是怎么變換的。

矩陣及其運(yùn)算

一.?dāng)?shù)學(xué)概念

定義1.1 由!

juzhen1.gif

個(gè)數(shù)

juzhen2.gif

排成m行n列的數(shù)表

juzhen3.gif

稱為m行n列的矩陣隶症,簡(jiǎn)稱 矩陣政模,記作

juzhen4.gif

二.原理,公式和法則

1.矩陣的加法
(1) 公式

juzhen5.gif

(2) 運(yùn)算律

juzhen6.gif

2.?dāng)?shù)乘矩陣
(1) 公式

juzhen7.gif

(2) 運(yùn)算律

juzhen8.gif

3.矩陣與矩陣相乘

(1) 設(shè)
juzhen9.gif

, 則
juzhen10.gif

,其中
juzhen11.gif

蚂会,且
juzhen12.gif

(2) 運(yùn)算符(假設(shè)運(yùn)算都是可行的):

juzhen13.gif

(3) 方陣的運(yùn)算

juzhen14.gif

注意:①矩陣乘法一般不滿足交換律淋样。

②一般
juzhen15.gif

4.矩陣的轉(zhuǎn)置
(1) 公式

juzhen16.png
juzhen17.png

(2) 運(yùn)算律

juzhen18.gif

!

5.方陣的行列式

juzhen19.png

6.共軛矩陣

juzhen20.png

上面一定要看懂矩陣的乘法是怎么運(yùn)算的才行。

數(shù)學(xué)原理

1胁住、基本幾何變換及變換矩陣

基本幾何變換都是相對(duì)于坐標(biāo)原點(diǎn)和坐標(biāo)軸進(jìn)行的幾何變換趁猴,有平移、比例彪见、旋轉(zhuǎn)儡司、反射和錯(cuò)切等

1.1 平移變換

是指將p點(diǎn)沿直線路徑從一個(gè)坐標(biāo)位置移到另一個(gè)坐標(biāo)位置的重定位過(guò)程。他是一種不產(chǎn)生變形而移動(dòng)物體的剛體變換(rigid-body transformation)余指,如下圖所示捕犬。


juzhen21.png

推導(dǎo):


juzhen22.png
    解釋(個(gè)人理解)
    x'=x+Tx  相當(dāng)于x'= x*1 + y*0 +  1 * Tx
    y'=y+Ty  相當(dāng)于y'= x*0 + y*1 +  1 * Ty
    
    所以 A 矩陣  [x  y 1]
         C 矩陣要和A矩陣格式一樣 [x' y' 1]
        c矩陣的1 怎么來(lái)。只能添加一行了
        
        1=x*0+y*0+ 1*1
        
所以b矩陣為 上面如圖

1.2 縮放變換
縮放變換是指對(duì)p點(diǎn)相對(duì)于坐標(biāo)原點(diǎn)沿x方向放縮Sx倍酵镜,沿y方向放縮Sy倍碉碉。其中Sx和Sy稱為縮放系數(shù)。

juzhen23.png

推導(dǎo):

juzhen24.png

矩陣

juzhen25.png
x'=x*Sx+y*0 + 0*0;
y'=x*0 +y *Sy+0*0;
0=x*0+y*0+0*1;

縮放變換可改變物體的大小淮韭,如下圖所示垢粮。當(dāng)Sx=Sy >1時(shí),圖形沿兩個(gè)坐標(biāo)軸方向等比例放大靠粪;當(dāng)Sx=Sy<1蜡吧,圖形沿兩個(gè)坐標(biāo)軸方向等比例縮小占键;當(dāng)Sx≠Sy昔善,圖形沿兩個(gè)坐標(biāo)軸方向作非均勻的比例變換。

juzhen26.png

1.3 旋轉(zhuǎn)變換

二維旋轉(zhuǎn)是指將p點(diǎn)繞坐標(biāo)原點(diǎn)轉(zhuǎn)動(dòng)某個(gè)角度(逆時(shí)針為正捞慌,順時(shí)針為負(fù))得到新的點(diǎn)p’的重定位過(guò)程耀鸦。

[圖片上傳失敗...(image-cbfe81-1535962641767)]

推導(dǎo):利用極坐標(biāo)方程

juzhen28.png

逆時(shí)針旋轉(zhuǎn)θ角的矩陣如下:

juzhen29.png

1.4 對(duì)稱變換

對(duì)稱變換后的圖形是原圖形關(guān)于某一軸線或原點(diǎn)的鏡像。


juzhen30.png

(1)關(guān)于x軸對(duì)稱

juzhen31.png
x'=x*1+y*0+0*0;
y'=x*0+y*(-1)+0*0;
0=x*0+y*0+0*1;

(2)關(guān)于y軸對(duì)稱

juzhen33.png

(3)關(guān)于原點(diǎn)對(duì)稱

juzhen34.png

(4)關(guān)于y=x軸對(duì)稱

juzhen35.png

(5)關(guān)于y=-x軸對(duì)稱

juzhen36.png

1.5 錯(cuò)切變換

錯(cuò)切變換也稱為剪切、錯(cuò)位變換袖订,用于產(chǎn)生彈性物體的變形處理氮帐。

juzhen37.png

錯(cuò)切變換的變換矩陣為:

juzhen38.png

(1)沿x方向錯(cuò)切:b=0
(2)沿y方向錯(cuò)切:c=0
(3)兩個(gè)方向錯(cuò)切:b和c都不等于0。

2洛姑、 復(fù)合變換

如果圖形要做一次以上的幾何變換上沐,那么可以將各個(gè)變換矩陣綜合起來(lái)進(jìn)行一步到位的變換。復(fù)合變換有如下的性質(zhì):

1)復(fù)合平移

對(duì)同一圖形做兩次平移相當(dāng)于將兩次的平移兩加起來(lái):

juzhen39.png

2)復(fù)合縮放

兩次連續(xù)的縮放相當(dāng)于將縮放操作相乘:

juzhen40.png

3)復(fù)合旋轉(zhuǎn)

兩次連續(xù)的旋轉(zhuǎn)相當(dāng)于將兩次的旋轉(zhuǎn)角度相加:

juzhen41.png
縮放楞艾、旋轉(zhuǎn)變換都與參考點(diǎn)有關(guān)参咙,上面進(jìn)行的各種變換都是以原點(diǎn)為參考點(diǎn)的。如果相對(duì)某個(gè)一般的參考點(diǎn)(xf硫眯,yf)作縮放蕴侧、旋轉(zhuǎn)變換,相當(dāng)于將該點(diǎn)移到坐標(biāo)原點(diǎn)處两入,然后進(jìn)行縮放净宵、旋轉(zhuǎn)變換,最后將(xf裹纳,yf)點(diǎn)移回原來(lái)的位置择葡。

4)關(guān)于(xf,yf)點(diǎn)的縮放變換

juzhen42.png

5)繞(xf剃氧,yf)點(diǎn)的旋轉(zhuǎn)變換

juzhen43.png

3敏储、二維圖形幾何變換的計(jì)算

幾何變換均可表示成P’=P*T的形式

(1)點(diǎn)的變換:先將點(diǎn)表示為規(guī)范化齊次坐標(biāo)形式,再乘以變換矩陣朋鞍。

juzhen44.png

(2)直線的變換:將直線的兩個(gè)端點(diǎn)表示為規(guī)范化齊次坐標(biāo)形式已添,再乘以變換矩陣。

juzhen45.png

(3)多邊形的變換:將多邊形的頂點(diǎn)表示為規(guī)范化齊次坐標(biāo)形式滥酥,再乘以變換矩陣酝碳。

juzhen46.png

(4)曲線的變換:將曲線的每個(gè)點(diǎn)表示為規(guī)范化齊次坐標(biāo)形式,再乘以變換矩陣恨狈。

4、復(fù)合變換的矩陣點(diǎn)乘的先后問(wèn)題

1)如果采用以下方式計(jì)算幾何變換的變換矩陣

juzhen47.png

如上范例所示呛讲,其先執(zhí)行變換的矩陣放在前面禾怠,后執(zhí)行變換的矩陣放在后面。

2)如果采用以下方式計(jì)算幾何變換的變換矩陣:

juzhen48.png

如上范例所示贝搁,其先執(zhí)行變換的矩陣放在后面吗氏,后執(zhí)行變換的矩陣放在前面。

這是因?yàn)榫仃嚨奶匦裕?div id="f15drrb" class="image-package">
juzhen49.png

CGAffineTransform.h 函數(shù)介紹

說(shuō)了半天雷逆,不來(lái)點(diǎn)代碼怎么行弦讽。

在CGAffineTransform.h 文件中

typedef struct CGAffineTransform CGAffineTransform;

struct CGAffineTransform {
    CGFloat a, b, c, d;
     CGFloat tx, ty;
};

矩陣數(shù)學(xué)模型是[a  b]
             c  d
            tx  ty
省略了  [a  b  0]  中的最后一列
        c  d  0
        tx ty 1

函數(shù)介紹代碼

///獲取一個(gè)標(biāo)準(zhǔn)矩陣。沒(méi)有變化的矩陣
CGAffineTransform transform=  CGAffineTransformIdentity;
NSLog(@"CGAffineTransformIdentity 數(shù)值%@" ,   NSStringFromCGAffineTransform(transform));

///獲取一個(gè)變幻矩陣 這個(gè)函數(shù)可以平移旋轉(zhuǎn)和縮放
/* Return the transform [ a b c d tx ty ]. */

transform= CGAffineTransformMake(a, b, c, d,x,y);

///獲取一個(gè)只做平移的矩陣
//        t' = [ 1 0 0 1 tx ty ]

transform= CGAffineTransformMakeTranslation(x, y);

///獲取一個(gè)縮放矩陣
//         t' = [ sx 0 0 sy 0 0 ] 

transform= CGAffineTransformMakeScale(a,c);

//獲取一個(gè)旋轉(zhuǎn)矩陣
/* Return a transform which rotates by `angle' radians:
 t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] */

transform= CGAffineTransformMakeRotation(3);

///驗(yàn)證是否是標(biāo)準(zhǔn)矩陣

BOOL isTrue = CGAffineTransformIsIdentity(transform);

///這個(gè)是矩陣之間的換算了
/* Translate `t' by `(tx, ty)' and return the result:
 t' = [ 1 0 0 1 tx ty ] * t */
/// 說(shuō)的很明確 用只有平移的矩陣和 t 矩陣相乘 t*t' 意思是在t'的基礎(chǔ)上做t 變幻(例如平移旋轉(zhuǎn)等等)
transform=   CGAffineTransformTranslate(transform,x,y);

///矩陣先縮放再transform
/* Scale `t' by `(sx, sy)' and return the result:
 t' = [ sx 0 0 sy 0 0 ] * t */

transform= CGAffineTransformScale(transform,a,c);

///矩陣先旋轉(zhuǎn)再transform
/* Rotate `t' by `angle' radians and return the result:
 t' =  [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] * t */
transform = CGAffineTransformRotate(transform,3);


NSLog(@"CGAffineTransformInvert前 數(shù)值%@" , NSStringFromCGAffineTransform(transform));
/// 獲取 反轉(zhuǎn)矩陣  看不出效果。做圖看看  可以仔細(xì)研究下
///我看著就是沿著y軸做了一個(gè)對(duì)稱變換 (不見得對(duì))
transform =   CGAffineTransformInvert(transform);
NSLog(@"CGAffineTransformInvert后 數(shù)值%@" , NSStringFromCGAffineTransform(transform));


///矩陣相乘
/* Concatenate `t2' to `t1' and return the result:
 t' = t1 * t2 */

transform = CGAffineTransformConcat(transform,transform);

///判斷兩個(gè)矩陣是否相等
/* Return true if `t1' and `t2' are equal, false otherwise. */
isTrue =CGAffineTransformEqualToTransform(transform,transform);

///獲取一個(gè)點(diǎn)矩陣變幻另一個(gè)點(diǎn)的位置
/* Transform `point' by `t' and return the result:
 p' = p * t
 where p = [ x y 1 ]. */

CGPoint point= CGPointApplyAffineTransform(CGPointMake(30, 30), transform);

///獲取一個(gè)矩形矩形變換的大小
/* Transform `size' by `t' and return the result:
 s' = s * t
 where s = [ width height 0 ]. */
CGSize size= CGSizeApplyAffineTransform(CGSizeMake(30, 30),transform);

///獲取矩形位置變幻后的位置
 CGRect rect=CGRectApplyAffineTransform(CGRectMake(0, 0, 30, 30),transform);

項(xiàng)目中有每個(gè)函數(shù)的具體用法往产。


transformNew.gif

項(xiàng)目托管在github

參考文章:

矩陣定義

變換原理

蘋果官方文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末被碗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仿村,更是在濱河造成了極大的恐慌锐朴,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔼囊,死亡現(xiàn)場(chǎng)離奇詭異焚志,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)畏鼓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門酱酬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人云矫,你說(shuō)我怎么就攤上這事膳沽。” “怎么了泼差?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵贵少,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我堆缘,道長(zhǎng)滔灶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任吼肥,我火速辦了婚禮录平,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缀皱。我一直安慰自己斗这,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布啤斗。 她就那樣靜靜地躺著表箭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钮莲。 梳的紋絲不亂的頭發(fā)上免钻,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音崔拥,去河邊找鬼极舔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛链瓦,可吹牛的內(nèi)容都是我干的拆魏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼渤刃!你這毒婦竟也來(lái)了拥峦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤溪掀,失蹤者是張志新(化名)和其女友劉穎事镣,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揪胃,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡璃哟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喊递。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片随闪。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖骚勘,靈堂內(nèi)的尸體忽然破棺而出铐伴,到底是詐尸還是另有隱情,我是刑警寧澤俏讹,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布当宴,位于F島的核電站,受9級(jí)特大地震影響泽疆,放射性物質(zhì)發(fā)生泄漏户矢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一殉疼、第九天 我趴在偏房一處隱蔽的房頂上張望梯浪。 院中可真熱鬧,春花似錦瓢娜、人聲如沸挂洛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)虏劲。三九已至,卻和暖如春褒颈,著一層夾襖步出監(jiān)牢的瞬間伙单,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工哈肖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人念秧。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓淤井,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子币狠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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