void CGContextDrawImage (
CGContextRef c,
CGRect rect,
CGImageRef image
);
移动函数
CGContextTranslateCTM (myContext, 100, 50);
![Transforms(未完) - happy dog - 又一个部落格 Transforms(未完) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/0a66e407f5fd703bca57cd1a607da5ac.gif)
旋转函数
include <math.h>
static inline double radians (double degrees) {return degrees * M_PI/180;}
CGContextRotateCTM (myContext, radians(–45.));
![Transforms(未完) - happy dog - 又一个部落格 Transforms(未完) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/8730697c2e7db76f224451d4460d08ef.gif)
缩放
CGContextScaleCTM (myContext, .5, .75);
![Transforms(未完) - happy dog - 又一个部落格 Transforms(未完) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/cb7c144db370efd0530677a2c77387cb.gif)
翻转, 两种转换合成后的效果,先把图片移动到右上角,然后旋转180度
CGContextTranslateCTM (myContext, w,h);
CGContextRotateCTM (myContext, radians(-180.));
![Transforms(未完) - happy dog - 又一个部落格 Transforms(未完) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/479bd52ba180ed90dbfe5e62879f0d9e.gif)
组合几个动作
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);
![Transforms(未完) - happy dog - 又一个部落格 Transforms(未完) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/b1f7df31da4d7411856f9819608c3f51.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 - 又一个部落格 Transforms(待续) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/e8b61c953f2e7d75effda6831d5a6c41.gif)
下面举例说明几个转换运算的数学实现
x y 是原先点的坐标
下面是从用户坐标转换到设备坐标的计算公式
![Transforms(待续) - happy dog - 又一个部落格 Transforms(待续) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/4808270c2246d0b809f9535a18cf4734.gif)
![Transforms(待续) - happy dog - 又一个部落格 Transforms(待续) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/86039574ca87c69c4ecec18c3d454916.gif)
下面是一个identity matrix,就是输入什么坐标,出来什么坐标,没有转换
![Transforms(待续) - happy dog - 又一个部落格 Transforms(待续) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/438daf57f7ff5d8f99d9591814866699.gif)
最终的计算结果是 x=x,y=y,
![Transforms(待续) - happy dog - 又一个部落格 Transforms(待续) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/a9bfd264abdcc257769954f5067baace.gif)
可以用函数判断这个矩阵是不是一个 identity matrix
bool CGAffineTransformIsIdentity (
CGAffineTransform t
);
移动矩阵
![Transforms(待续) - happy dog - 又一个部落格 Transforms(待续) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/71c2a1ca8301898229d7a7d6311f714d.gif)
![Transforms(待续) - happy dog - 又一个部落格 Transforms(待续) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/15fbf4eff2a44f84e7837dce0cb336c7.gif)
缩放矩阵
![Transforms(待续) - happy dog - 又一个部落格 Transforms(待续) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/98c2f017c793828b52fb995acdf742d7.gif)
![Transforms(待续) - happy dog - 又一个部落格 Transforms(待续) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/9baf7ff30f6ec74fad05728aa911de3d.gif)
旋转矩阵
![Transforms(待续) - happy dog - 又一个部落格 Transforms(待续) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/134564c771f1ac91f40af539416b38c7.gif)
![Transforms(待续) - happy dog - 又一个部落格 Transforms(待续) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/801c3fff5e6608e6b561a580e99725b4.gif)
旋转加移动矩阵
![Transforms(待续) - happy dog - 又一个部落格 Transforms(待续) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/555113e9c017d19810a7d5e445698cb5.gif)
![Transforms(待续) - happy dog - 又一个部落格 Transforms(待续) - happy dog - 又一个部落格](https://i-blog.csdnimg.cn/blog_migrate/aa5df06c96ba27ab6f71d51c2bdfdf27.gif)