CGAffineTransform这个东西呢,名字比较长,意思呢也不好理解,刚接触的人对这个东西估计都有点摸不着头脑。平时自己也少去研究这货,近日闲来无事,琢磨了一阵子,对CGAffineTransform算是略有了解,特记下来,以加深记忆。
先来说说CGAffineTransform是干啥使的。它就是用于2D仿射变换。那么问题来了!什么是2D仿射变换?
在几何上定义为两个向量空间之间的一个仿射变换或者仿射映射,由一个线性变换接上一个平移组成。(说了跟没说差不多,不懂的还是不懂)
好吧,解释太概念化了,我们来说说有什么用。
它是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(其实是指保二维图形间的相对位置关系不变,平行线还是平行线,而直线上点的位置顺序不变)——源自百度百科
说的更实际点,平移,缩放,旋转,错切就属于仿射变换。
基础概念讲的差不多了,我们来说一下它是如果产生效果的,我们先看下面这张图。
图中的(x,y)是原来的坐标,(x',y')则是经过仿射变换后的新坐标,m00等参数就是CGAffineTransform里面的各个参数,也就是说CGAffineTransform类就是用于描述这个矩阵。注意,CGAffineTransform产生的效果不是针对某个像素点,而是作用于对象,也是对象的所有点的坐标都会发生这样的变换。
我们来看一下CGAffineTransform的定义
struct CGAffineTransform {
CGFloat a, b, c, d;
CGFloat tx, ty;
};
a,b,c,d,tx,ty就是矩阵中前两行的元素,它们是怎么对应的呢?
好吧,直接上结果。
a=m00, b=m10;
c=m01, d=m11;
tx=m02, ty=m12;
现在我们来解释一下比较基础的变化。
从最简单的说起吧,平移
CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty)
返回 t' = [ 1 0 0 1 tx ty ](对应a,b,c,d,tx,ty)
现在参照上面的图片,可以得出结果 x'=x+tx, y'=y+ty;每个点都是这样的结果,从而就达到了平移的效果。
然后再来个缩放
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
返回
t' = [ sx 0 0 sy 0 0 ]
参照上面的图片,得出结果 x'=sx*x, y'=sy*y
结果很明显,就不解释了。
tx,ty的作用比较明显,a,b,c,d一起出现的时候,会对点产生比较复杂的效果,例如旋转、翻转等效果。通过改变transform,就可以产生此类效果。以后要是还有研究,再陆续补上。
另外一个小技巧,通过设置transform来平移物体,可以省去换算坐标系的问题。