iOS CGAffineTransform详解

原创 2015年09月01日 17:10:03

CGAffineTransform定义

UIViewtransform属性是一个CGAffineTransform类型,用于在二维空间做旋转,缩放和平移。CGAffineTransform是一个可以和二维空间向量(例如CGPoint)做乘法的3X2的矩阵。称为仿射变换,“仿射”的意思是无论变换矩阵用什么值,图层中平行的两条线在变换之后任然保持平行”。

官方定义:

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

虽然结构体中只有a,b,c,d,tx,ty 6个参数,但其实还有3个固定的参数[0,0,1]来组成3x3的矩阵。

如下图所示:

图5.1


x' = a*x + c*y + tx   y' = x*b + y*d + ty 




向量的变换

图像上每个点的位置可以看成一个向量n维向量,取决于图像的空间。所以对图像的变换可以等价于对向量的变换,研究向量的变换可以让我们更直观的了解图像变换的原理 1. 向量的平移(对坐标系内某点得移动)向量的平移2. 向量的缩放 X饭方向缩放a倍,Y方向缩放b倍,则有向量的缩放3. 向量的旋转 二位平面的向量旋转,即可以表示为三维空间的向量绕Z轴的旋转 如图:
向量的缩放将向量x在平面X-Y内绕原点旋转B,假设向量x的模为R,则根据三角函数的知识得向量旋转推倒,旋转后的向量为旋转后的向量为用矩阵表达即为旋转后的矩阵表达式

齐次坐标

齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,例如,二维点(x,y)的齐次坐标表示为(hx,hy,h)。由此可以看出,一个向量的齐次表示是不唯一的,齐次坐标的h取不同的值都表示的是同一个点,比如齐次坐标(8,4,2)、(4,2,1)表示的都是二维点(4,2)许多图形应用涉及到几何变换,主要包括平移、旋转、缩放。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为p' = p *m1+ m2(注:因为习惯的原因,实际使用时一般使用变化矩阵左乘向量)(m1旋转缩放矩阵, m2为平移矩阵, p为原向量 ,p'为变换后的向量)。引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法


所以2D变换的矩阵,就是刚开始的那个3行3列的矩阵。对上述方法进行拓展,我们很容易得出三维空间的变换矩阵3d_transform



identity矩阵

/* The identity transform: [ 1 0 0 1 0 0 ]. */
CG_EXTERN const CGAffineTransform CGAffineTransformIdentity
  CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

identity矩阵可以表示为




CGAffineTransformMakeTranslation方法

/* Return a transform which translates by `(tx, ty)':
     t' = [ 1 0 0 1 tx ty ] */

CG_EXTERN CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx,
  CGFloat ty) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

CGAffineTransformMakeTranslation是一个进行平移的方法,根据注释得到的矩阵为




CGAffineTransformMakeScale方法

/* Return a transform which scales by `(sx, sy)':
     t' = [ sx 0 0 sy 0 0 ] */

CG_EXTERN CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
  CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

CGAffineTransformMakeScale是一个进行缩放的方法,根据注释得到的矩阵为




CGAffineTransformMakeRotation方法

/* Return a transform which rotates by `angle' radians:
     t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] */

CG_EXTERN CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)
  CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

CGAffineTransformMakeRotation是一个进行旋转的方法,根据注释得到的矩阵为




错切




IOS CGAffineTransform 用于视图平移,放缩,旋转

CGAffineTransform 今天碰到了一个旋转放缩图片的一个demo,在看的过程中发现实现图片变化的那个方法特别简单。 一共只有三句话,下面就是这个方法 - (void)transformIm...
  • u012884714
  • u012884714
  • 2013年12月20日 21:45
  • 18903

iOS学习之UI初级————CGAffineTransform坐标系统变换以及UIView的属性动画

浅谈编者对CGAffineTransform坐标系统变换以及UIView的属性动画的认识和理解 坐标系统变换通过transform属性来改变 ·CGAffineTransformScale...
  • Lerryteng
  • Lerryteng
  • 2016年03月30日 22:47
  • 1768

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

一、理论基础请参考CGAffineTransform简单分析二、效果演示三、实现代码3.1:位移变换-(void)positionAnimation{ _demoView.transform ...
  • yixiangboy
  • yixiangboy
  • 2015年09月22日 12:51
  • 6388

iOS开发:仿射变换CGAffineTransform原理与详解

UIView有CGAffineTransform类型的属性transform,它是定义在二维空间上完成View的平移,旋转,缩放等效果的实现。 初始化: CGAffineTransform  t...
  • jijiji000111
  • jijiji000111
  • 2017年03月28日 11:34
  • 677

iOS开发——CGAffineTransform 详解

使用CGAffineTransform旋转后基准坐标轴已经改变 , 如果希望依照标准坐标轴来移动 , 需要改变center来修改位置...
  • null29
  • null29
  • 2016年03月30日 22:57
  • 200

IOS利用CGAffineTransform实现图片旋转

实现一张图片的旋转部分角度显示 [objc] view plaincopy UIImageView *image = [[UIImageView alloc]init]; ...
  • s0228g0228
  • s0228g0228
  • 2014年08月08日 18:13
  • 1863

IOS中CGAffineTransform的使用方法

常用: #define M_E         2.71828182845904523536028747135266250   e #define M_LOG2E     1.4426950408...
  • Eduora_meimei
  • Eduora_meimei
  • 2014年04月15日 20:28
  • 1614

IOS CGAffineTransform 用于视图平移,放缩,旋转

CGAffineTransform 今天碰到了一个旋转放缩图片的一个demo,在看的过程中发现实现图片变化的那个方法特别简单。 一共只有三句话,下面就是这个方法 - (void)transfor...
  • intheair100
  • intheair100
  • 2014年08月24日 21:54
  • 545

IOS开发—CGAffineTransform的使用大概

IOS中CGAffineTransform的使用大概 CoreGraphics框架中的CGAffineTransform类可用于设定UIView的transform属性,控制视图的缩放、旋转和平移操作...
  • Lotheve
  • Lotheve
  • 2015年06月14日 15:36
  • 1615

IOS CGAffineTransform 用于视图平移,放缩,旋转

CGAffineTransform 今天碰到了一个旋转放缩图片的一个demo,在看的过程中发现实现图片变化的那个方法特别简单。 一共只有三句话,下面就是这个方法 - (void)transformIm...
  • wang_Bo_JustOne
  • wang_Bo_JustOne
  • 2017年06月13日 12:20
  • 115
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS CGAffineTransform详解
举报原因:
原因补充:

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