CGAffineTransform 进行仿射变换

CGAffineTransform

已知某个形状的点集合,需要在某个坐标系下面(view、layer)绘图,绘图之后需要对这个形状进行缩放(放大、缩小)、平移、旋转操作,这时就需要用到CGAffineTransform来进行仿射变换。

CGAffineTransform 原理

根据学过的矩阵变换知识,对于三维坐标系下的一个坐标点(x,y,z),可以使用一个三维矩阵来进行变化来任意操作(x,y,z)。
类似的,对于二维坐标系,也可以使用一个3x3矩阵来调整x,y的值,而通过调整x,y可以实现二维形状的平移缩放和移动。整个transform过程就是一个对x,y调整的过程,比如要实现向上平移a,向下平移b,只需把图形对于的坐标(x,y)变成(x+a,y+b)。

下面是CGAffineTransform内部仿射变换矩阵:

这里写图片描述

可以通过下面的公式来调整x,y的内容:

引用块内容

其结果如下:

这里写图片描述

可以看出只要对这两个式子里面的a,b,c,d,tx,ty复制即可实现不同效果的x’, y’。CGAffineTransform内部提供的方法就是通过操作这个3x3矩阵内部a,b,c,d,tx,ty值来实现的。

Apple CGAffineTransform API提供了如下的方法来实现:

CGAffineTransformMakeTranslation实现以初始位置为基准,在x轴方向上平移x单位,在y轴方向上平移y单位。

可以使用如下方法进行初始化:

Initializers
init(rotationAngle: CGFloat)
Returns an affine transformation matrix constructed from a rotation value you provide.

init(scaleX: CGFloat, y: CGFloat)
Returns an affine transformation matrix constructed from scaling values you provide.

init(translationX: CGFloat, y: CGFloat)
Returns an affine transformation matrix constructed from translation values you provide.

init(a: CGFloat, b: CGFloat, c: CGFloat, d: CGFloat, tx: CGFloat, ty: CGFloat)

下面以UIGraphicsGetCurrentContext为例,使用context进行绘图时,可以通过

func concatenate(_ transform: CGAffineTransform)

来为context 设置仿射。

let context = UIGraphicsGetCurrentContext()
let t = CGAffineTransform(translationX: offset.x, y: offset.y)
context.concatenate(t)

之后在context上绘图就会有仿射效果。

猜你喜欢

转载自blog.csdn.net/sinat_15735647/article/details/78739910
今日推荐