最近刚好遇到了Core Graphics中的基本变换,一直都没搞明白,于是细细看了下。
先来看下CGAffineTransform这个基本结构体的定义:
struct CGAffineTransform {
CGFloat a, b, c, d;
CGFloat tx, ty;
};
乍一看好像明白好像又不明白,额,那就是不明白啦~ 还好官方文档里有比较详细的解释。
In Quartz, affine transforms are represented by a 3 by 3 matrix:
a b 0
c d 0
tx ty 1
这就意味着在一个二维坐标系中任意一点(x,y)可以经过矩阵进行变换得到新的点(x’,y’),从而达到各种仿射变换的目的。
x'=ax+cy+tx
y'=bx+dy+ty
上面公式是完整版的,通过给a,b,c,d,tx,ty中某些值赋特定值可以达到一些基本变换的效果,而一些复杂的效果都可以通过拆分为基本变换的组合来实现。
1.CGAffineTransformMakeRotation –> 旋转变换
CGAffineTransform CGAffineTransformMakeRotation ( CGFloat angle )
cosa | sina | 0
-sina | cosa | 0
0 | 0 | 1
这里的tx=0,ty=0,a b c d也换成了只与角度a有关的三角函数。
旋转后的结果:
x’=xcosa-ysina
y’=xsina+ycosa
2.CGAffineTransformMakeScale –> 缩放变换
CGAffineTransform CGAffineTransformMakeScale ( CGFloat sx, CGFloat sy );
这里只有2个参数sx,sy
相应的矩阵为
sx | 0 | 0
0 | sy | 0
0 | 0 | 1
缩放后x’=x*sx;y’=y*sy,很好理解是将x和y分别乘上一个数
3.CGAffineTransformMakeTranslation –> 平移变换
CGAffineTransform CGAffineTransformMakeTranslation ( CGFloat tx, CGFloat ty );
这里也只有两个参数,如果不清楚还是挺搞不清分别代表什么含义,但是理解了矩阵变换之后就很明了。这里把a b c d 分别替换成了1 0 0 1
1 | 0 | 0
0 | 1 | 0
tx | ty | 1
平移过后:
x'=x+tx
y'=y+ty
一目了然是将点进行了平移。
其实知道了这个
x'=ax+cy+tx
y'=bx+dy+ty
才是关键,其他都是从其简化而来。