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, 视图是会旋转
CGAffineTransformIdentity 重置为控件最原始的位置
CGAffineTransformMake 可以缩放、移动、旋转操作,参数含义上面已经介绍。
CGAffineTransformMakeTranslation 可以做平移操作,参数含义上面已经介绍。
CGAffineTransformMakeScale 可以做缩放操作,参数含义上面已经介绍。
CGAffineTransformMakeRotation 可以做旋转操作,参数含义上面已经介绍。
CGAffineTransformIsIdentity 判断控件的原始位置是否改变
CGAffineTransformTranslate 每次都是以传入的CGAffineTransform参数作为起点,做tx水平方向和ty垂直方向移动
CGAffineTransformScale 每次都是以传入的CGAffineTransform参数作为起点,根据参数sx 和 sy 进行缩放(x,y分别代表水平方向和垂直方向)
CGAffineTransformRotate 每次都是以传入的CGAffineTransform参数作为起点,根据参数angle(角度)进行旋转。
CGAffineTransformInvert 反转效果
CGAffineTransformConcat 合并两个交换
CGAffineTransformEqualToTransform 判断两个 交换是否一致
CGPointApplyAffineTransform 在结构体 CGPoint 一个点上做变换操作
CGSizeApplyAffineTransform 在结构体 CGSize 上做变换操作
CGRectApplyAffineTransform 在结构体 CGRect 上做变换操作