Transforms CTM, 轉換矩陣

2021-06-01 18:10:43 字數 4019 閱讀 8542

transforms ctm, 轉換矩陣

quartz轉換實現的原理:quartz把繪圖分成兩個部分,

使用者空間,即和裝置無關,

裝置空間,

使用者空間和裝置空間中間存在乙個轉換矩陣 : ctm

本章實質是講解ctm

quartz提供的3大功能

移動,旋轉,縮放

演示如下,首先載入一張

void cgcontextdrawimage (

cgcontextref c,

cgrect rect,

cgimageref image

);

移動函式
cgcontexttranslatectm (mycontext, 100, 50);

旋轉函式
include static inline double radians (double degrees) 

cgcontextrotatectm (mycontext, radians(–45.));

縮放

cgcontextscalectm (mycontext, .5, .75);

翻轉, 兩種轉換合成後的效果,先把移動到右上角,然後旋轉180度

cgcontexttranslatectm (mycontext, w,h);

cgcontextrotatectm (mycontext, radians(-180.));

組合幾個動作

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);

上面是通過直接修改當前的ctm實現3大效果,下面是通過建立affine transforms,然後連線ctm實現同樣的3種效果

這樣做的好處是可以重用這個affine transforms

應用affine transforms 到ctm的函式

void cgcontextconcatctm (

cgcontextref c,

cgaffinetransform transform

);creating affine transforms

移動效果

cgaffinetransform cgaffinetransformmaketranslation (

cgfloat tx,

cgfloat ty

);cgaffinetransform cgaffinetransformtranslate (

cgaffinetransform t,

cgfloat tx,

cgfloat ty

);旋轉效果

cgaffinetransform cgaffinetransformmakerotation (

cgfloat angle

);cgaffinetransform cgaffinetransformrotate (

cgaffinetransform t,

cgfloat angle

);縮放效果

cgaffinetransform cgaffinetransformmakescale (

cgfloat sx,

cgfloat sy

);cgaffinetransform cgaffinetransformscale (

cgaffinetransform t,

cgfloat sx,

cgfloat sy

);反轉效果

cgaffinetransform cgaffinetransforminvert (

cgaffinetransform t

);只對區域性產生效果

cgrect rect,

cgaffinetransform t

);判斷兩個affinetrans是否相等

bool cgaffinetransformequaltotransform (

cgaffinetransform t1,

cgaffinetransform t2

);獲得affine transform

cgaffinetransform cgcontextgetuserspacetodevicespacetransform (

cgcontextref c

);下面的函式只起到檢視的效果,比如看一下這個使用者空間的點,轉換到裝置空間去座標是多少

cgpoint cgcontextconvertpointtodevicespace (

cgcontextref c,

cgpoint point

);cgpoint cgcontextconvertpointtouserspace (

cgcontextref c,

cgpoint point

);cgsize cgcontextconvertsizetodevicespace (

cgcontextref c,

cgsize size

);cgsize cgcontextconvertsizetouserspace (

cgcontextref c,

cgsize size

);cgrect cgcontextconvertrecttodevicespace (

cgcontextref c,

cgrect rect

);cgrect cgcontextconvertrecttouserspace (

cgcontextref c,

cgrect rect

);ctm真正的數學行為

這個轉換矩陣其實是乙個 3x3的 舉證

如下圖

下面舉例說明幾個轉換運算的數學實現

x y 是原先點的座標

下面是從使用者座標轉換到裝置座標的計算公式

下面是乙個identity matrix,就是輸入什麼座標,出來什麼座標,沒有轉換

最終的計算結果是 x=x,y=y,

可以用函式判斷這個矩陣是不是乙個 identity matrix

bool cgaffinetransformisidentity (

);

移動矩陣

縮放矩陣

旋轉矩陣

旋轉加移動矩陣

transforms CTM,變換矩陣

quartz轉換實現的原理 quartz把繪圖分成兩個部分,使用者空間,即和裝置無關,裝置空間,使用者空間和裝置空間中間存在乙個轉換矩陣 ctm 本章實質是講解ctm quartz提供的3大功能 移動,旋轉,縮放 演示如下,首先載入一張 移動函式cgcontexttranslatectm mycon...

Oracle轉換(顯示轉換)

三種常用的轉換函式 1.to char number character date character 2.to number character number 3.to date character date 一 轉換函式 1.日期到字串的轉換中 to char 引數一,引數二 引數1 日期型值或...

資料轉換 強制轉換

1 2 強制型別轉換 3 1.特點 需要進行特殊的格式處理,不能自動完成。4 2.格式 範圍小的型別 範圍小的變數名 範圍小的型別 原本範圍大的資料 56 注意事項 7 1.強制型別轉換一般不推薦使用,因為有可能發生精度損失 資料溢位。8 2.byte short char這三種型別都可以發生數 算...