β

CGAffineTransform 使用

xiaominfc's blog 155 阅读
ios

总结一下CGAffineTransform 的API
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

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

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

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)

public func CGAffineTransformIsIdentity(t: CGAffineTransform) -> Bool
这个是判断 通过构造出来的CGAffineTransform 变换后的x’ y’ 是否跟原来的x y一样

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

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

public func CGAffineTransformConcat(t1: CGAffineTransform, _ t2: CGAffineTransform) -> CGAffineTransform
这个是让两个矩阵相乘得出新的3×3矩阵中对应的值 构造出新的CGAffineTransform (注意是是矩阵相乘)

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 CGPointApplyAffineTransform(point: CGPoint, _ t: CGAffineTransform) -> CGPoint
public func CGSizeApplyAffineTransform(size: CGSize, _ t: CGAffineTransform) -> CGSize
public func CGRectApplyAffineTransform(rect: CGRect, _ t: CGAffineTransform) -> CGRect

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

大致就是这些内容

来个易于理解的公式
gongshi

ios
作者:xiaominfc's blog
Just a programmer
原文地址:CGAffineTransform 使用, 感谢原作者分享。

发表评论