Quartz转换实现的原理:Quartz把绘图分成两个部分,
用户空间,即和设备无关,
设备空间,
用户空间和设备空间中间存在一个转换矩阵 : CTM
本章实质是讲解CTM
Quartz提供的3大功能
移动,旋转,缩放
演示如下,首先加载一张图片
void CGContextDrawImage ( CGContextRef c, CGRect rect, CGImageRef image );
![Transforms(未完) - happy dog - 又一个部落格](http://img305.ph.126.net/ZxoZyhKAKJIi6m2krlpUUA==/3758253889040725739.gif)
移动函数
CGContextTranslateCTM (myContext, 100, 50);
![Transforms(未完) - happy dog - 又一个部落格](http://img308.ph.126.net/qdQt-kIK5-UQICVWRqSOtw==/3913628076185007941.gif)
旋转函数
include <math.h> static inline double radians (double degrees) {return degrees * M_PI/180;}
CGContextRotateCTM (myContext, radians(–45.));
![Transforms(未完) - happy dog - 又一个部落格](http://img.ph.126.net/mRgBJT8Gj5o5EZ6xByCBaQ==/3334634049091558445.gif)
缩放
CGContextScaleCTM (myContext, .5, .75);
![Transforms(未完) - happy dog - 又一个部落格](http://img319.ph.126.net/nFD2oT_-emDcx5zZsYSTng==/3826933783358125949.gif)
翻转, 两种转换合成后的效果,先把图片移动到右上角,然后旋转180度
CGContextTranslateCTM (myContext, w,h); CGContextRotateCTM (myContext, radians(-180.));
![Transforms(未完) - happy dog - 又一个部落格](http://img313.ph.126.net/LIdSS-GnD5i2Crwt1DWpQA==/3670152221330610511.gif)
组合几个动作
CGContextTranslateCTM (myContext, w/4, 0); CGContextScaleCTM (myContext, .25, .5); CGContextRotateCTM (myContext, radians ( 22.));
![Transforms(未完) - happy dog - 又一个部落格](http://img307.ph.126.net/tookQT8_gCHADxZyagvlCQ==/3792875311176136708.gif)
CGContextRotateCTM (myContext, radians ( 22.)); CGContextScaleCTM (myContext, .25, .5);
CGContextTranslateCTM (myContext, w/4, 0);
![Transforms(未完) - happy dog - 又一个部落格](http://img314.ph.126.net/nYsBivSQNhvC3PQk5beKzQ==/3874784529398937302.gif)
上面是通过直接修改当前的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的 举证
如下图
![Transforms(待续) - happy dog - 又一个部落格](http://img.ph.126.net/yFKBqj56Rt1pGSveK5zpDA==/3224014383245225362.gif)
下面举例说明几个转换运算的数学实现
x y 是原先点的坐标
下面是从用户坐标转换到设备坐标的计算公式
![Transforms(待续) - happy dog - 又一个部落格](http://img313.ph.126.net/Od5PcxgKpPYLN9EWTGKFTA==/3681129745422332740.gif)
![Transforms(待续) - happy dog - 又一个部落格](http://img.ph.126.net/HJ4flYgDuhTutowlTEpeRA==/3224014383245225357.gif)
下面是一个identity matrix,就是输入什么坐标,出来什么坐标,没有转换
![Transforms(待续) - happy dog - 又一个部落格](http://img314.ph.126.net/v-4iOh-n85lwdrmci5qCpA==/3888858278234475935.gif)
最终的计算结果是 x=x,y=y,
![Transforms(待续) - happy dog - 又一个部落格](http://img311.ph.126.net/yTsHxD4setCUTxs9cvuGoQ==/3813704459452730818.gif)
可以用函数判断这个矩阵是不是一个 identity matrix
bool CGAffineTransformIsIdentity ( CGAffineTransform t );
移动矩阵
![Transforms(待续) - happy dog - 又一个部落格](http://img313.ph.126.net/hL4jvHAtV2S6rQVx9UU0Xw==/3669026321423773455.gif)
![Transforms(待续) - happy dog - 又一个部落格](http://img317.ph.126.net/DWcd6eGBJ_uVb6g2vilUgg==/3779083037317318043.gif)
缩放矩阵
![Transforms(待续) - happy dog - 又一个部落格](http://img314.ph.126.net/4DKikA9e_p0Wa3Yr1bulHg==/3876473379259207093.gif)
![Transforms(待续) - happy dog - 又一个部落格](http://img.ph.126.net/prNySenz4a0d6MPmsJDPcg==/3224014383245225360.gif)
旋转矩阵
![Transforms(待续) - happy dog - 又一个部落格](http://img.ph.126.net/EULfAY6lKp1ahpr78xnkHA==/1530097973399510189.gif)
![Transforms(待续) - happy dog - 又一个部落格](http://img.ph.126.net/aDQ2fwH3-1V_HIsvNuIOrA==/3287346253005094495.gif)
旋转加移动矩阵
![Transforms(待续) - happy dog - 又一个部落格](http://img.ph.126.net/NhAcAMF0-8QRlPSCSZ8MuQ==/3257509905473761831.gif)
![Transforms(待续) - happy dog - 又一个部落格](http://img.ph.126.net/C5f2uUmqf2uHdfNmVHjenA==/3717721492394514769.gif)