关于Core Graphics中基本仿射变换

最近刚好遇到了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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值