Quartz 2D 繪制模型定義了兩個(gè)完全不同的坐標(biāo)系統(tǒng)荧缘,用戶空間帕膜,它代表文檔頁(yè)枣氧。設(shè)備空間,代表設(shè)備原生的分辨率垮刹。用戶空間是浮點(diǎn)數(shù)达吞,這和設(shè)備空間的像素分辨率沒(méi)有關(guān)系。當(dāng)你想打印或者顯示你的文檔時(shí)荒典,Quartz將用戶空間映射到設(shè)備空間坐標(biāo)酪劫。所以你不需要重寫你的應(yīng)用程序或者額外的代碼來(lái)調(diào)整你的應(yīng)用程序輸出在不同的設(shè)備上最佳顯示。你可以修改默認(rèn)的用戶空間通過(guò)操作當(dāng)前轉(zhuǎn)換矩陣(CTM)寺董,在你創(chuàng)建上下文后覆糟,當(dāng)前矩陣是單位矩陣,你可以使用Quartz方法修改CTM遮咖,congratulation修改用戶用戶空間的繪制滩字。
本章介紹:
?1。你可以用來(lái)修改矩陣的方法的概述
?2。展示如何修改CTM麦箍。
?3. 描述如何創(chuàng)建仿射變換漓藕。
?4.展示如果確定兩個(gè)變換是等同的
?5.描述了如何獲得用戶設(shè)備空間變換
?6.討論了仿射變換后的數(shù)學(xué)知識(shí)。
一 挟裂。About Quartz Transformation Functions
Quartz 2D提供了五個(gè)方法可以修改CTM享钞,你可以旋轉(zhuǎn),平移和縮放CTM诀蓉。你也可以把CTM和一個(gè)仿射矩陣聯(lián)系起來(lái) 嫩与。SeeModifying the Current Transformation Matrix.
Quartz 2D還允許你創(chuàng)建仿射變換,但是不能操作用戶空間知道你轉(zhuǎn)換了CTM交排。你可以用另一個(gè)方法創(chuàng)建仿射變換划滋,從而和CTM連接起來(lái)。SeeCreating Affine Transforms.
你可以使用任何一組方法卻不用了解任何關(guān)于矩陣的數(shù)學(xué)埃篓。然而假如你想知道Quartz在調(diào)用這些轉(zhuǎn)換方法時(shí)是怎么工作的处坪,可以閱讀The Math Behind the Matrices.
Modifying the Current Transformation Matrix 修改CTM
在你轉(zhuǎn)換CTM之前你需要保存當(dāng)前圖形狀態(tài),以便你繪制完后恢復(fù)圖形狀態(tài)架专。
介紹四個(gè)操作:translation, rotation, scaling, and concatenation
?第一步: CGContextDrawImage (myContext, rect, myImage);
?
平移:x 方向平移100 個(gè)點(diǎn)同窘, y 方向平移50 個(gè)點(diǎn)。調(diào)用這個(gè)方法:CGContextTranslateCTM (myContext, 100, 50);
旋轉(zhuǎn):CGContextRotateCTM (myContext, radians(–45.));
縮放:CGContextScaleCTM (myContext, .5, .75);
矩陣聯(lián)系:你可以將幾個(gè)矩陣形成一個(gè)新的矩陣部脚,包含了矩陣的累積效應(yīng)想邦。調(diào)用這個(gè)方法CGContextConcatCTM連接CTM與一個(gè)仿射矩陣。更多的關(guān)于仿射矩陣查看Creating Affine Transforms.要實(shí)現(xiàn)這種累積效應(yīng)委刘,你可以多操作幾次變換丧没。
? CGContextTranslateCTM (myContext, w,h);
? CGContextRotateCTM (myContext, radians(-180.));
5-7 圖展示了平移 縮放 旋轉(zhuǎn):
???????? CGContextTranslateCTM (myContext, w/4, 0);
???????? CGContextScaleCTM (myContext, .25,? .5);
???????? CGContextRotateCTM (myContext, radians ( 22.));
變換下順序:CGContextRotateCTM (myContext, radians ( 22.));
???????????????????? CGContextScaleCTM (myContext, .25,? .5);
???????????????????? CGContextTranslateCTM (myContext, w/4, 0);
?
Creating Affine Transforms? 創(chuàng)建仿射變換
Quartz中仿射變換是針對(duì)于矩陣的,在CTM不可用锡移∨煌可以構(gòu)造一個(gè)仿射矩陣然后調(diào)用CGContextConcatCTM添加到CTM上。仿射變換返回的是個(gè)數(shù)據(jù)結(jié)構(gòu)淆珊。仿射變換和CTM方法類似夺饲,不要需要注意的是 平移 旋轉(zhuǎn) 縮放 每個(gè)都有兩個(gè)方法。
??
Quartz還提供了一個(gè)仿射變換函數(shù)施符,CGAffineTransformInvert往声。反轉(zhuǎn)通常被用于對(duì)變換后的點(diǎn)提供反向變換。當(dāng)你需要恢復(fù)已經(jīng)被矩陣轉(zhuǎn)換后的值的時(shí)候反轉(zhuǎn)是非常有用處的戳吝『葡可以通過(guò):反轉(zhuǎn)矩陣,然后乘以被反轉(zhuǎn)的值就是原來(lái)的值骨坑。你通常不需要反轉(zhuǎn)變換因?yàn)槟憧梢哉{(diào)到CTM的旋轉(zhuǎn)效果通過(guò)保存和恢復(fù)圖形狀態(tài)撼嗓。
在某些情況 你可能不想轉(zhuǎn)換整個(gè)空間柬采,僅僅是一個(gè)點(diǎn)或者大小 或者 矩形框∏揖可以分別調(diào)用以下函數(shù):CGPointApplyAffineTransform粉捻,CGSizeApplyAffineTransform.CGRectApplyAffineTransform.
你可以創(chuàng)建一個(gè)新的仿射通過(guò)調(diào)用函數(shù)的CGAffineTransformMake變換,但不是做出新的仿射變換功能斑芜,這需要你提供矩陣元素肩刃。為了有效地使用這個(gè)功能,你需要有一個(gè)矩陣數(shù)學(xué)的理解杏头。SeeThe Math Behind the Matrices
Evaluating Affine Transforms 比較多個(gè)仿射變換
可以調(diào)用函數(shù)CGAffineTransformEqualToTransform.判斷兩個(gè)仿射變換是不是相同盈包。
CGAffineTransformIsIdentity 可以檢查便函是不是一個(gè)identity transform。
一個(gè)常數(shù):CGAffineTransformIdentity
Getting the User to Device Space Transform 獲取用戶設(shè)備空間變換
調(diào)用 CGContextGetUserSpaceToDeviceSpaceTransform.可以獲得Quartz用來(lái)在用戶和設(shè)備之間的轉(zhuǎn)換醇王。
Quartz提供了一個(gè)方便的功能呢燥,以改變用戶空間和設(shè)備空間之間的幾何。你會(huì)發(fā)現(xiàn)這些功能更容易使用比 CGContextGetUserSpaceToDeviceSpaceTransform更好用寓娩。
? ? ? ? Points. The functionsCGContextConvertPointToDeviceSpace and CGContextConvertPointToUserSpacetransform aCGPointdata type from one space to the other.
?????? Sizes. The functionsCGContextConvertSizeToDeviceSpace and CGContextConvertSizeToUserSpacetransform aCGSizedata type from one space to the other.
?????? Rectangles. The functionsCGContextConvertRectToDeviceSpace and CGContextConvertRectToUserSpacetransform aCGRectdata type from one space to the other.
The Math Behind the Matrices?? 矩陣后面的數(shù)學(xué)知識(shí)叛氨。
關(guān)于矩陣你只需要了解的是 CGAffineTransformMake。
?? 可以重拾大學(xué)的線性代數(shù)棘伴。