关于Core Graphics中基本仿射变换

来源:互联网 发布:联发科x10优化 编辑:程序博客网 时间:2024/06/07 03:09

最近刚好遇到了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+txy'=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+txy'=y+ty

一目了然是将点进行了平移。

其实知道了这个

x'=ax+cy+txy'=bx+dy+ty

才是关键,其他都是从其简化而来。

0 0
原创粉丝点击