Quartz 2D之Transforms

Quartz 2D 繪制模型定義了兩個完全不同的坐標系統(tǒng),用戶空間,它代表文檔頁。設備空間,代表設備原生的分辨率。用戶空間是浮點數(shù),這和設備空間的像素分辨率沒有關系。當你想打印或者顯示你的文檔時,Quartz將用戶空間映射到設備空間坐標。所以你不需要重寫你的應用程序或者額外的代碼來調整你的應用程序輸出在不同的設備上最佳顯示。你可以修改默認的用戶空間通過操作當前轉換矩陣(CTM),在你創(chuàng)建上下文后,當前矩陣是單位矩陣,你可以使用Quartz方法修改CTM,congratulation修改用戶用戶空間的繪制。

本章介紹:

?1。你可以用來修改矩陣的方法的概述

?2。展示如何修改CTM。

?3. 描述如何創(chuàng)建仿射變換。

?4.展示如果確定兩個變換是等同的

?5.描述了如何獲得用戶設備空間變換

?6.討論了仿射變換后的數(shù)學知識。

一 。About Quartz Transformation Functions


Quartz 2D提供了五個方法可以修改CTM,你可以旋轉,平移和縮放CTM。你也可以把CTM和一個仿射矩陣聯(lián)系起來 。SeeModifying the Current Transformation Matrix.

Quartz 2D還允許你創(chuàng)建仿射變換,但是不能操作用戶空間知道你轉換了CTM。你可以用另一個方法創(chuàng)建仿射變換,從而和CTM連接起來。SeeCreating Affine Transforms.

你可以使用任何一組方法卻不用了解任何關于矩陣的數(shù)學。然而假如你想知道Quartz在調用這些轉換方法時是怎么工作的,可以閱讀The Math Behind the Matrices.

Modifying the Current Transformation Matrix 修改CTM

在你轉換CTM之前你需要保存當前圖形狀態(tài),以便你繪制完后恢復圖形狀態(tài)。

介紹四個操作:translation, rotation, scaling, and concatenation

?第一步: CGContextDrawImage (myContext, rect, myImage);


?

平移:x 方向平移100 個點, y 方向平移50 個點。調用這個方法:CGContextTranslateCTM (myContext, 100, 50);



旋轉:CGContextRotateCTM (myContext, radians(–45.));


縮放:CGContextScaleCTM (myContext, .5, .75);


矩陣聯(lián)系:你可以將幾個矩陣形成一個新的矩陣,包含了矩陣的累積效應。調用這個方法CGContextConcatCTM連接CTM與一個仿射矩陣。更多的關于仿射矩陣查看Creating Affine Transforms.要實現(xiàn)這種累積效應,你可以多操作幾次變換。

? CGContextTranslateCTM (myContext, w,h);

? CGContextRotateCTM (myContext, radians(-180.));


5-7 圖展示了平移 縮放 旋轉:

???????? 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中仿射變換是針對于矩陣的,在CTM不可用??梢詷嬙煲粋€仿射矩陣然后調用CGContextConcatCTM添加到CTM上。仿射變換返回的是個數(shù)據(jù)結構。仿射變換和CTM方法類似,不要需要注意的是 平移 旋轉 縮放 每個都有兩個方法。
??

Quartz還提供了一個仿射變換函數(shù),CGAffineTransformInvert。反轉通常被用于對變換后的點提供反向變換。當你需要恢復已經被矩陣轉換后的值的時候反轉是非常有用處的??梢酝ㄟ^:反轉矩陣,然后乘以被反轉的值就是原來的值。你通常不需要反轉變換因為你可以調到CTM的旋轉效果通過保存和恢復圖形狀態(tài)。

在某些情況 你可能不想轉換整個空間,僅僅是一個點或者大小 或者 矩形框??梢苑謩e調用以下函數(shù):CGPointApplyAffineTransform,CGSizeApplyAffineTransform.CGRectApplyAffineTransform.

你可以創(chuàng)建一個新的仿射通過調用函數(shù)的CGAffineTransformMake變換,但不是做出新的仿射變換功能,這需要你提供矩陣元素。為了有效地使用這個功能,你需要有一個矩陣數(shù)學的理解。SeeThe Math Behind the Matrices

Evaluating Affine Transforms 比較多個仿射變換

可以調用函數(shù)CGAffineTransformEqualToTransform.判斷兩個仿射變換是不是相同。

CGAffineTransformIsIdentity 可以檢查便函是不是一個identity transform。

一個常數(shù):CGAffineTransformIdentity

Getting the User to Device Space Transform 獲取用戶設備空間變換

調用 CGContextGetUserSpaceToDeviceSpaceTransform.可以獲得Quartz用來在用戶和設備之間的轉換。

Quartz提供了一個方便的功能,以改變用戶空間和設備空間之間的幾何。你會發(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ù)學知識。

關于矩陣你只需要了解的是 CGAffineTransformMake。



?? 可以重拾大學的線性代數(shù)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容