CGAffineTransformMake(a,b,c,d,tx,ty) 矩阵运算的原理

转载 2016年05月30日 11:19:27

偶然间看到一片讲解 矩阵动画解释听简洁的帖子,收藏下。顺便说下,其实官方开发文档中对于很多知识点有详细的介绍,大家平时可以多阅读文档。。。(虽然是英文的)

原文地址:http://justsee.iteye.com/blog/1969933


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

CGAffineTransformMake(a,b,c,d,tx,ty) 

ad缩放bc旋转tx,ty位移,基础的2D矩阵

 公式

    x=ax+cy+tx
    y=bx+dy+ty

 

1.矩阵的基本知识:

struct CGAffineTransform

{
  CGFloat a, b, c, d;
  CGFloat tx, ty;
};

CGAffineTransform CGAffineTransformMake (CGFloat a,CGFloat b,CGFloat c,CGFloat d,CGFloat tx,CGFloat ty);

为了把二维图形的变化统一在一个坐标系里,引入了齐次坐标的概念,即把一个图形用一个三维矩阵表示,其中第三列总是(0,0,1),用来作为坐标系的标准。所以所有的变化都由前两列完成。

以上参数在矩阵中的表示为:

 |a    b    0|

 |c    d    0|

 |tx   ty   1|

 

运算原理:原坐标设为(X,Y,1);

                            |a    b    0|

       [X,Y,  1]      |c    d    0|     =     [aX + cY + tx   bX + dY + ty  1] ;

                            |tx    ty  1|

通过矩阵运算后的坐标[aX + cY + tx   bX + dY + ty  1],我们对比一下可知:

第一种:设a=d=1, b=c=0.  

[aX + cY + tx   bX + dY + ty  1] = [X  + tx  Y + ty  1];

可见,这个时候,坐标是按照向量(tx,ty)进行平移,其实这也就是函数

CGAffineTransform CGAffineMakeTranslation(CGFloat tx,CGFloat ty)的计算原理。

第二种:设b=c=tx=ty=0.  

[aX + cY + tx   bX + dY + ty  1] = [aX    dY   1];

可见,这个时候,坐标X按照a进行缩放,Y按照d进行缩放,a,d就是X,Y的比例系数,其实这也就是函数

CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)的计算原理。a对应于sx,d对应于sy。

第三种:设tx=ty=0,a=cosɵ,b=sinɵ,c=-sinɵ,d=cosɵ。

[aX + cY + tx   bX + dY + ty  1] = [Xcosɵ - Ysinɵ    Xsinɵ + Ycosɵ  1] ;

可见,这个时候,ɵ就是旋转的角度,逆时针为正,顺时针为负。其实这也就是函数

CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)的计算原理。angle即ɵ的弧度表示。

2.利用上面的变换写一个UIImage矩阵变换的例子:

下面是一个关于image的矩阵运算的例子,无外乎是运用以上三种变换的组合,达到所定义的效果

Java代码  收藏代码
  1. //UIImageOrientation的定义,定义了如下几种变换  
  2. typedef enum   
  3. {  
  4.     UIImageOrientationUp,            // default orientation  
  5.   
  6.    UIImageOrientationDown,          // 180 deg rotation  
  7.   
  8.    UIImageOrientationLeft,          // 90 deg CCW  
  9.       
  10.     UIImageOrientationRight,         // 90 deg CW  
  11.       
  12.     UIImageOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip  
  13.       
  14.     UIImageOrientationDownMirrored,  // horizontal flip  
  15.       
  16.     UIImageOrientationLeftMirrored,  // vertical flip  
  17.       
  18.     UIImageOrientationRightMirrored, // vertical flip  
  19.   
  20. } UIImageOrientation;  
  21.   
  22. //按照UIImageOrientation的定义,利用矩阵自定义实现对应的变换;  
  23.   
  24. -(UIImage *)transformImage:(UIImage *)aImage    
  25.   
  26. {    
  27.   
  28.     CGImageRef imgRef = aImage.CGImage;    
  29.       
  30.     CGFloat width = CGImageGetWidth(imgRef);    
  31.       
  32.     CGFloat height = CGImageGetHeight(imgRef);    
  33.        
  34.     CGAffineTransform transform = CGAffineTransformIdentity;    
  35.       
  36.     CGRect bounds = CGRectMake(00, width, height);    
  37.          
  38.     CGFloat scaleRatio = 1;    
  39.          
  40.     CGFloat boundHeight;    
  41.       
  42.     UIImageOrientation orient = aImage.imageOrientation;    
  43.       
  44.     switch(UIImageOrientationLeftMirrored)    
  45.       
  46.     {    
  47.               
  48.         case UIImageOrientationUp:    
  49.               
  50.             transform = CGAffineTransformIdentity;  
  51.   
  52.             break;    
  53.                          
  54.         case UIImageOrientationUpMirrored:   
  55.               
  56.             transform = CGAffineTransformMakeTranslation(width, 0.0);    
  57.               
  58.             transform = CGAffineTransformScale(transform, -1.01.0); //沿y轴向左翻   
  59.               
  60.             break;    
  61.                          
  62.         case UIImageOrientationDown:              
  63.             transform = CGAffineTransformMakeTranslation(width, height);    
  64.               
  65.             transform = CGAffineTransformRotate(transform, M_PI);    
  66.               
  67.             break;    
  68.                          
  69.         case UIImageOrientationDownMirrored:   
  70.               
  71.             transform = CGAffineTransformMakeTranslation(0.0, height);    
  72.               
  73.             transform = CGAffineTransformScale(transform, 1.0, -1.0);    
  74.               
  75.             break;    
  76.                         
  77.         case UIImageOrientationLeft:     
  78.               
  79.             boundHeight = bounds.size.height;    
  80.               
  81.             bounds.size.height = bounds.size.width;    
  82.               
  83.             bounds.size.width = boundHeight;    
  84.               
  85.             transform = CGAffineTransformMakeTranslation(0.0, width);    
  86.               
  87.             transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);    
  88.               
  89.             break;  
  90.                          
  91.         case UIImageOrientationLeftMirrored:     
  92.               
  93.             boundHeight = bounds.size.height;    
  94.               
  95.             bounds.size.height = bounds.size.width;    
  96.               
  97.             bounds.size.width = boundHeight;    
  98.               
  99.             transform = CGAffineTransformMakeTranslation(height, width);    
  100.               
  101.             transform = CGAffineTransformScale(transform, -1.01.0);    
  102.               
  103.             transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);    
  104.               
  105.             break;    
  106.               
  107.         case UIImageOrientationRight: //EXIF = 8    
  108.               
  109.             boundHeight = bounds.size.height;    
  110.               
  111.             bounds.size.height = bounds.size.width;    
  112.               
  113.             bounds.size.width = boundHeight;    
  114.               
  115.             transform = CGAffineTransformMakeTranslation(height, 0.0);    
  116.               
  117.             transform = CGAffineTransformRotate(transform, M_PI / 2.0);    
  118.               
  119.             break;  
  120.                          
  121.         case UIImageOrientationRightMirrored:   
  122.               
  123.             boundHeight = bounds.size.height;    
  124.               
  125.             bounds.size.height = bounds.size.width;    
  126.               
  127.             bounds.size.width = boundHeight;    
  128.               
  129.             transform = CGAffineTransformMakeScale(-1.01.0);    
  130.               
  131.             transform = CGAffineTransformRotate(transform, M_PI / 2.0);    
  132.               
  133.             break;    
  134.                                                                      
  135.         default:    
  136.               
  137.             [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];    
  138.               
  139.     }    
  140.        
  141.     UIGraphicsBeginImageContext(bounds.size);    
  142.              
  143.     CGContextRef context = UIGraphicsGetCurrentContext();    
  144.             
  145.     if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) {    
  146.           
  147.         CGContextScaleCTM(context, -scaleRatio, scaleRatio);    
  148.           
  149.         CGContextTranslateCTM(context, -height, 0);    
  150.           
  151.     }    
  152.       
  153.     else {    
  154.           
  155.         CGContextScaleCTM(context, scaleRatio, -scaleRatio);    
  156.           
  157.         CGContextTranslateCTM(context, 0, -height);    
  158.           
  159.     }    
  160.          
  161.     CGContextConcatCTM(context, transform);    
  162.          
  163.     CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(00, width, height), imgRef);    
  164.       
  165.     UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();  
  166.          
  167.     UIGraphicsEndImageContext();    
  168.          
  169.     return imageCopy;    
  170.       
  171. }   

 

 

参考地址:https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_affine/dq_affine.html

相关文章推荐

IOS开发UI篇--仿射变换(CGAffineTransform)使用小结

一、理论基础请参考CGAffineTransform简单分析二、效果演示三、实现代码3.1:位移变换-(void)positionAnimation{ _demoView.transform ...

CGAffineTransformMake(a,b,c,d,tx,ty) 矩阵运算的原理

简记: CGAffineTransformMake(a,b,c,d,tx,ty)  ad缩放bc旋转tx,ty位移,基础的2D矩阵  公式     x=ax+cy+tx   ...

iOS 集移动,旋转,缩放于一体的函数:CGAffineTransformMake(a,b,c,d,tx,ty)

CGAffineTransformMake(a,b,c,d,tx,ty)  对应的参数: ad缩放 bc旋转 tx,ty位移(以被移动的对象多中心点为基准)...

矩阵运算、脚本解析c程序练手

  • 2016年12月26日 10:57
  • 1.21MB
  • 下载

Unity3D 矩阵运算

前言:今天在项目中运用到了矩阵的旋转,于是就把矩阵的运算仔细查了一下,顿时觉得自己的离散、线代学的很差劲啊,矩阵也是3D数学中十分重要的基础,在Unity中,我们很多时候都会用到,掌握一下很有必要。 ...
  • arbut
  • arbut
  • 2015年03月11日 20:40
  • 869

矩阵运算C代码(含求逆)

  • 2014年03月31日 23:55
  • 6KB
  • 下载

在C中实现矩阵运算

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:XP 开发环境:mingw 功...
  • jdh99
  • jdh99
  • 2012年03月28日 14:01
  • 10522

excel矩阵运算

  • 2015年04月06日 14:35
  • 160KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CGAffineTransformMake(a,b,c,d,tx,ty) 矩阵运算的原理
举报原因:
原因补充:

(最多只允许输入30个字)