CGAffineTransform详解

struct CGAffineTransform {

  CGFloat a, b, c, d;

  CGFloat tx, ty;

};

CGAffineTransform其实就是一个矩阵

深层次的理解需要一定程度的高等数学、线性代数等知识,自己还在理解中...

原理是我在网上找到的,挫人都能看懂一些,想必大家一定也能看懂,具体内容如下:

为了把二维图形的变化统一在一个坐标系里,引入了齐次坐标概念,即把一个图形用一个三维矩阵表示,其中第三列总是(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 = b = 1,b = c = 0.

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

可见这时候,坐标是按照向量(tx,ty)进行平移,这就是苹果官方提供的函数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的缩放比例系数这就是苹果官方提供的函数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];

可见这时候,θ就是旋转的角度,逆时针为正,顺时针为负。其实这就是苹果官方提供的函数CGAffineTransformMakeRotation(CGFloat angle)的计算原理。angle θ的弧度表示。

下面来说下参数和所有函数代表的含义:

1.如果让参数 c,d为0    

a表示x水平方向缩放,    tx表示x水平方向偏移

d表示y垂垂直方向缩放, ty表示y垂直方向偏移

2.如果让参数 c,d不为0, 视图是会旋转

094759_dBFX_2334416.png

CGAffineTransformIdentity      重置为控件最原始的位置

095433_idSm_2334416.png

CGAffineTransformMake     可以缩放、移动、旋转操作,参数含义上面已经介绍。

105013_1vF2_2334416.png

CGAffineTransformMakeTranslation     可以做平移操作,参数含义上面已经介绍。

105220_oPRy_2334416.png

CGAffineTransformMakeScale     可以做缩放操作,参数含义上面已经介绍。

105453_wGpz_2334416.png

CGAffineTransformMakeRotation 可以做旋转操作,参数含义上面已经介绍。

110254_b7I4_2334416.png

CGAffineTransformIsIdentity     判断控件的原始位置是否改变

210811_2Mu0_2334416.png

CGAffineTransformTranslate     每次都是以传入的CGAffineTransform参数作为起点,做tx水平方向和ty垂直方向移动

211410_43bM_2334416.png

CGAffineTransformScale        每次都是以传入的CGAffineTransform参数作为起点,根据参数sx 和 sy 进行缩放(x,y分别代表水平方向和垂直方向)

211911_eu44_2334416.png

CGAffineTransformRotate         每次都是以传入的CGAffineTransform参数作为起点,根据参数angle(角度)进行旋转。

212655_Jyoo_2334416.png

CGAffineTransformInvert        反转效果

213126_CcCl_2334416.png

CGAffineTransformConcat           合并两个交换

214611_Tfcr_2334416.pngCGAffineTransformEqualToTransform        判断两个 交换是否一致

215106_EM5c_2334416.png

CGPointApplyAffineTransform        在结构体 CGPoint 一个点上做变换操作

215220_jQ7A_2334416.png

CGSizeApplyAffineTransform        在结构体 CGSize 上做变换操作

220306_zPTF_2334416.png

CGRectApplyAffineTransform        在结构体 CGRect 上做变换操作








转载于:https://my.oschina.net/ospost90s/blog/407007

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值