Transforms CTM 转换矩阵

来源:互联网 发布:移动网络进电信服务器 编辑:程序博客网 时间:2024/05/16 10:24

注:转自星尘的天空博客http://www.cnblogs.com/xingchen/archive/2011/09/04/2166508.html,仅供学习用。

Link Address:http://hi.baidu.com/aidfan/blog/item/61b0fe00d8f56909728b65bd.html

Quartz转换实现的原理:Quartz把绘图分成两个部分,
    用户空间,即和设备无关,
    设备空间,
用户空间和设备空间中间存在一个转换矩阵 : CTM
本章实质是讲解CTM
Quartz提供的3大功能
移动,旋转,缩放
演示如下,首先加载一张图片
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 TransformCGAffineTransform 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,就是输入什么坐标,出来什么坐标,没有转换

 可以用函数判断这个矩阵是不是一个 identity matrix
bool CGAffineTransformIsIdentity (   CGAffineTransform t);
移动矩阵