zoukankan      html  css  js  c++  java
  • Transforms CTM, 转换矩阵

    Quartz转换实现的原理:Quartz把绘图分成两个部分,
        用户空间,即和设备无关,
        设备空间,
    用户空间和设备空间中间存在一个转换矩阵 : CTM
    本章实质是讲解CTM
     
    Quartz提供的3大功能
    移动,旋转,缩放
     
    演示如下,首先加载一张图片
    void CGContextDrawImage (    CGContextRef c,    CGRect rect,    CGImageRef image );
     
    Transforms(未完) - happy dog - 又一个部落格
     
     
     
    移动函数
    CGContextTranslateCTM (myContext, 100, 50);
    
    Transforms(未完) - happy dog - 又一个部落格
    
    
    
    旋转函数
    include <math.h> static inline double radians (double degrees) {return degrees * M_PI/180;}
    CGContextRotateCTM (myContext, radians(–45.));
    
    Transforms(未完) - happy dog - 又一个部落格
    
    
    
    缩放
    CGContextScaleCTM (myContext, .5, .75);
    
    Transforms(未完) - happy dog - 又一个部落格
    
    
    
    翻转, 两种转换合成后的效果,先把图片移动到右上角,然后旋转180度
    CGContextTranslateCTM (myContext, w,h); CGContextRotateCTM (myContext, radians(-180.));
     
    Transforms(未完) - happy dog - 又一个部落格
     
    组合几个动作
    CGContextTranslateCTM (myContext, w/4, 0); CGContextScaleCTM (myContext, .25,  .5); CGContextRotateCTM (myContext, radians ( 22.));
     
    
    
    Transforms(未完) - happy dog - 又一个部落格
     
     
     
    CGContextRotateCTM (myContext, radians ( 22.)); CGContextScaleCTM (myContext, .25,  .5);
    CGContextTranslateCTM (myContext, w/4, 0);
     
    Transforms(未完) - happy dog - 又一个部落格
     
     
    上面是通过直接修改当前的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 - 又一个部落格
     
    下面举例说明几个转换运算的数学实现
    x y 是原先点的坐标
    下面是从用户坐标转换到设备坐标的计算公式
    Transforms(待续) - happy dog - 又一个部落格
     
    Transforms(待续) - happy dog - 又一个部落格
     
    下面是一个identity matrix,就是输入什么坐标,出来什么坐标,没有转换
    Transforms(待续) - happy dog - 又一个部落格
    最终的计算结果是 x=x,y=y,
    Transforms(待续) - happy dog - 又一个部落格
     
     可以用函数判断这个矩阵是不是一个 identity matrix
    bool CGAffineTransformIsIdentity (    CGAffineTransform t );
    
    
    
    
    移动矩阵
    Transforms(待续) - happy dog - 又一个部落格
    Transforms(待续) - happy dog - 又一个部落格
     
    
    
    缩放矩阵
    Transforms(待续) - happy dog - 又一个部落格
     
    Transforms(待续) - happy dog - 又一个部落格
     
    旋转矩阵
    Transforms(待续) - happy dog - 又一个部落格
     
    Transforms(待续) - happy dog - 又一个部落格
     
    旋转加移动矩阵
    Transforms(待续) - happy dog - 又一个部落格
    Transforms(待续) - happy dog - 又一个部落格
  • 相关阅读:
    codec功能简介
    dtmf原理说明
    linux的vm.overcommit_memory的内存分配参数详解
    Hibernate与Sleep的区别
    简单的读写-simple_read_from_buffer
    linux delay sleep
    Linux系统上的popen()库函数
    Linux中popen函数的作用小结
    ulimit 命令详解
    LTE Cat1有什么用?基于4G LTE打造cat1,弥补NB-IoT和5G的空缺
  • 原文地址:https://www.cnblogs.com/greywolf/p/2594761.html
Copyright © 2011-2022 走看看