CGAffineTransform 使用

总结一下CGAffineTransform

CGAffineTransform 主要是UIView中的一个名为transform的属性使用的结构体

public struct CGAffineTransform {
    public var a: CGFloat
    public var b: CGFloat
    public var c: CGFloat
    public var d: CGFloat
    public var tx: CGFloat
    public var ty: CGFloat
    public init()
    public init(a: CGFloat, b: CGFloat, c: CGFloat, d: CGFloat, tx: CGFloat, ty: CGFloat)
}

主要是为了实现UIVIew 旋转(rotate) 移动(translate) 伸缩(scale) 这样的2D变换

CGAffineTransform这个结构体里有6个属性 假设一个point为 (x,y) 经过CGAffineTransform 变化后的point为

x’ = a * x + c * y + t * x 
y’ = b * x + b * y + t * y

说白了就是坐标系的变换

几个构造CGAffineTransform的函数

1.移动变换:

public func CGAffineTransformMakeTranslation(tx: CGFloat, _ ty: CGFloat) -> CGAffineTransform
构造出来的CGAffineTransform  a = 1, b = 0, c = 0, d = 1, tx = _tx , ty = _ty
代入公式就有:
x’ = x + tx 
y’ = y + ty

2.伸缩变换:

public func CGAffineTransformMakeScale(sx: CGFloat, _ sy: CGFloat) -> CGAffineTransform
构造出来的CGAffineTransform  a = sx, b = 0, c = 0, d = sy, tx = 0, ty = 0
代入公式就有:
x’ = x * sx
y’ = y * sy

3.旋转变换:

public func CGAffineTransformMakeRotation(angle: CGFloat) -> CGAffineTransform
构造出来的CGAffineTransform  a = cos(angle), b = sin(angle), c = -sin(angle) , d = cos(angle) , tx = 0, ty = 0
代入公式就有:
x’ = x * cos(angle) - y * sin(angle)
y’ = x * sin(angle) + y * cos(angle) 

4.矩阵求逆:

public func CGAffineTransformInvert(t: CGAffineTransform) -> CGAffineTransform
这个是根据矩阵求逆 求出对应的逆变换
api里讲道 CGAffineTransform 配合最后一列为(0,0,1) 构造了3x3的一个矩阵
| a  b  0 |
| c  d  0 |
| tx ty 1 |

上述接口就是对该矩阵求其逆矩阵 如果不存在逆矩阵就返回原来的(ps: 判断有没有逆矩阵的可以通过判断 (a * d) - (b * c)的值 如果不等于0 就有 等于 0 则没有) 求逆矩阵 可以看看线性代数

5.矩阵相乘:

public func CGAffineTransformConcat(t1: CGAffineTransform, _ t2: CGAffineTransform) -> CGAffineTransform

这个是让两个矩阵相乘得出新的3x3矩阵中对应的值 构造出新的CGAffineTransform (矩阵相乘)

6.矩阵相乘(其他形式):

public func CGAffineTransformTranslate(t: CGAffineTransform, _ tx: CGFloat, _ ty: CGFloat) -> CGAffineTransform
public func CGAffineTransformScale(t: CGAffineTransform, _ sx: CGFloat, _ sy: CGFloat) -> CGAffineTransform
public func CGAffineTransformRotate(t: CGAffineTransform, _ angle: CGFloat) -> CGAffineTransfor

这个三个api 主要是在后面用的参数的(除t: CGAffineTransform以外的参数)的基础上构造出的CGAffineTransform 与 t 进行矩阵相乘

其他接口

public func CGAffineTransformIsIdentity(t: CGAffineTransform) -> Bool

这个是判断 通过构造出来的CGAffineTransform 变换后的x’ y’ 是否跟原来的x y一样

public func CGPointApplyAffineTransform(point: CGPoint, _ t: CGAffineTransform) -> CGPoint
public func CGSizeApplyAffineTransform(size: CGSize, _ t: CGAffineTransform) -> CGSize
public func CGRectApplyAffineTransform(rect: CGRect, _ t: CGAffineTransform) -> CGRect

这三个接口是依次为了计算点 线(长宽) 面(矩形区域) 进行变换后的结果

小结

来个易于理解的公式:


(x’ , y’ , 1) = ( x , y , 1) * | a  b  0 |
                               | c  d  0 |
                               | tx ty 1 |

阅读量: