CGAffineTransform.h類的學(xué)習(xí)和原理講解
第一次寫ios相關(guān)技術(shù)博客旬薯,所以先寫個(gè)簡(jiǎn)單的,寫的不好大家多多提意見适秩。
想學(xué)好這個(gè)類绊序,我感覺最好還是從理論上弄明白什么二維圖形到底是怎么變換的。
矩陣及其運(yùn)算
一.?dāng)?shù)學(xué)概念
定義1.1 由!
個(gè)數(shù)
排成m行n列的數(shù)表
稱為m行n列的矩陣隶症,簡(jiǎn)稱 矩陣政模,記作
二.原理,公式和法則
1.矩陣的加法
(1) 公式
(2) 運(yùn)算律
2.?dāng)?shù)乘矩陣
(1) 公式
(2) 運(yùn)算律
3.矩陣與矩陣相乘
(1) 設(shè)
, 則
,其中
蚂会,且
(2) 運(yùn)算符(假設(shè)運(yùn)算都是可行的):
(3) 方陣的運(yùn)算
注意:①矩陣乘法一般不滿足交換律淋样。
②一般
4.矩陣的轉(zhuǎn)置
(1) 公式
(2) 運(yùn)算律
!
5.方陣的行列式
6.共軛矩陣
上面一定要看懂矩陣的乘法是怎么運(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)余指,如下圖所示捕犬。
推導(dǎo):
解釋(個(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ù)。
推導(dǎo):
矩陣
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)軸方向作非均勻的比例變換。
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)方程
逆時(shí)針旋轉(zhuǎn)θ角的矩陣如下:
1.4 對(duì)稱變換
對(duì)稱變換后的圖形是原圖形關(guān)于某一軸線或原點(diǎn)的鏡像。
(1)關(guān)于x軸對(duì)稱
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ì)稱
(3)關(guān)于原點(diǎn)對(duì)稱
(4)關(guān)于y=x軸對(duì)稱
(5)關(guān)于y=-x軸對(duì)稱
1.5 錯(cuò)切變換
錯(cuò)切變換也稱為剪切、錯(cuò)位變換袖订,用于產(chǎn)生彈性物體的變形處理氮帐。
錯(cuò)切變換的變換矩陣為:
(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):
2)復(fù)合縮放
兩次連續(xù)的縮放相當(dāng)于將縮放操作相乘:
3)復(fù)合旋轉(zhuǎn)
兩次連續(xù)的旋轉(zhuǎn)相當(dāng)于將兩次的旋轉(zhuǎn)角度相加:
縮放楞艾、旋轉(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)的縮放變換
5)繞(xf剃氧,yf)點(diǎn)的旋轉(zhuǎn)變換
3敏储、二維圖形幾何變換的計(jì)算
幾何變換均可表示成P’=P*T的形式
(1)點(diǎn)的變換:先將點(diǎn)表示為規(guī)范化齊次坐標(biāo)形式,再乘以變換矩陣朋鞍。
(2)直線的變換:將直線的兩個(gè)端點(diǎn)表示為規(guī)范化齊次坐標(biāo)形式已添,再乘以變換矩陣。
(3)多邊形的變換:將多邊形的頂點(diǎn)表示為規(guī)范化齊次坐標(biāo)形式滥酥,再乘以變換矩陣酝碳。
(4)曲線的變換:將曲線的每個(gè)點(diǎn)表示為規(guī)范化齊次坐標(biāo)形式,再乘以變換矩陣恨狈。
4、復(fù)合變換的矩陣點(diǎn)乘的先后問(wèn)題
1)如果采用以下方式計(jì)算幾何變換的變換矩陣
如上范例所示呛讲,其先執(zhí)行變換的矩陣放在前面禾怠,后執(zhí)行變換的矩陣放在后面。
2)如果采用以下方式計(jì)算幾何變換的變換矩陣:
如上范例所示贝搁,其先執(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ù)的具體用法往产。
項(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ō)我怎么就攤上這事膳沽。” “怎么了泼差?”我有些...
文/不壞的土叔 我叫張陵贵少,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我堆缘,道長(zhǎng)滔灶,這世上最難降的妖魔是什么? 我笑而不...
正文 為了忘掉前任吼肥,我火速辦了婚禮录平,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缀皱。我一直安慰自己斗这,他們只是感情好,可當(dāng)我...
文/花漫 我一把揭開白布啤斗。 她就那樣靜靜地躺著表箭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钮莲。 梳的紋絲不亂的頭發(fā)上免钻,一...
那天,我揣著相機(jī)與錄音崔拥,去河邊找鬼极舔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛链瓦,可吹牛的內(nèi)容都是我干的拆魏。 我是一名探鬼主播,決...
沈念sama閱讀 40,262評(píng)論 3贊 418 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼渤刃!你這毒婦竟也來(lái)了拥峦?” 一聲冷哼從身側(cè)響起,我...
序言:老撾萬(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日...
正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喊递。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片随闪。...
序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖骚勘,靈堂內(nèi)的尸體忽然破棺而出铐伴,到底是詐尸還是另有隱情,我是刑警寧澤俏讹,帶...
沈念sama閱讀 35,635評(píng)論 5贊 345 正文 年R本政府宣布当宴,位于F島的核電站,受9級(jí)特大地震影響泽疆,放射性物質(zhì)發(fā)生泄漏户矢。R本人自食惡果不足惜,卻給世界環(huán)境...
文/蒙蒙 一殉疼、第九天 我趴在偏房一處隱蔽的房頂上張望梯浪。 院中可真熱鬧,春花似錦瓢娜、人聲如沸挂洛。這莊子的主人今日做“春日...
文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)虏劲。三九已至,卻和暖如春褒颈,著一層夾襖步出監(jiān)牢的瞬間伙单,已是汗流浹背。 一陣腳步聲響...
我被黑心中介騙來(lái)泰國(guó)打工哈肖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人念秧。 一個(gè)月前我還...
沈念sama閱讀 48,048評(píng)論 3贊 370 正文 我出身青樓淤井,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子币狠,可洞房花燭夜當(dāng)晚...
1 CALayer IOS SDK詳解之CALayer(一) http://doc.okbase.net/Hell...
1 前言 OpenGL渲染3D模型離不開空間幾何的數(shù)學(xué)理論知識(shí)游两,而本篇文章的目的就是對(duì)空間幾何進(jìn)行簡(jiǎn)單的介紹,并對(duì)...
>*很不幸漩绵,沒(méi)人能告訴你母體是什么贱案,你只能自己體會(huì)* --駭客帝國(guó) 在第四章“可視效果”中,我們研究了一些增強(qiáng)圖層...
OPengl的渲染流程是先全部設(shè)置好數(shù)據(jù)和狀態(tài),GL_MODELVIEW是將當(dāng)前要變換的空間向量和模型視圖矩陣當(dāng)前...
蘿卜的蘿卜閱讀 1,022評(píng)論 0贊 2 引言 請(qǐng)不要質(zhì)疑你的眼睛碍扔,文章的題目就是“3D圖形學(xué)基礎(chǔ)理論”瘩燥。可能有人要疑惑了不同,作為一個(gè) iOS 開發(fā)者為什么要...