void CGContextDrawImage (
CGContextRef c,
CGRect rect,
CGImageRef image
);
移動函數
CGContextTranslateCTM (myContext, 100, 50);
旋轉函數
include <math.h>
static inline double radians (double degrees) {return degrees * M_PI/180;}
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 CGRectApplyAffineTransform (
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 (
CGAffineTransform t
);
移動矩陣
縮放矩陣
![Transforms(待續) - happy dog - 又一個部落格]()
旋轉矩陣
![Transforms(待續) - happy dog - 又一個部落格]()
旋轉加移動矩陣