CGAffineTransform的基础认识

CGAffineTransform是用于2D仿射变换的工具,它保持图形的平直性和平行性,涉及平移、缩放、旋转和错切等操作。在iOS开发中,它描述了一个变换矩阵,通过调整其参数实现对象的坐标变换效果,如平移可通过设置[a, b, c, d, tx, ty]为[1, 0, 0, 1, tx, ty]来实现。" 117719579,8675767,HTML5前端基础入门教程,"['HTML', '前端开发', 'Web开发', 'HTML5']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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来平移物体,可以省去换算坐标系的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值