什么是仿射变换矩阵

CGAffineTransform 实际上就是一个用于绘制 2D 图形的的仿射变换矩阵。仿射变换矩阵用于旋转、缩放、平移、扭曲(skew)在图形上下文中绘制的对象。CGAffineTransform 提供了了一些列的函数来创建、连接或者运用这些变换。

仿射变换通过一个 3 行 3 列的矩阵来表示:

那么对于一个点 (x,y) 来说,使用上边的矩阵来进行变换 (x',y') 是这样的:

结果是这样的:

上边就是仿射变换所有的核心内容,接下来说一下,Core Graphics 针对 CGAffineTransorm 为开发者提供的 API。

生成仿射变换矩阵

Core Graphics 一共提供了如下 4 个相关 API。

CGAffineTransform CGAffineTransformMake(CGFloat a, CGFloat b, CGFloat c, CGFloat d, CGFloat tx, CGFloat ty);

其各个参数的用途,参考这个矩阵:

CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle);

该函数对应这个矩阵:

CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy);

该函数对应的矩阵如下:

CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty);

该函数对应的矩阵如下:

改变已有的仿射变换矩阵

CGAffineTransform CGAffineTransformTranslate(CGAffineTransform t, CGFloat tx, CGFloat ty);
CGAffineTransform CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy);
CGAffineTransform CGAffineTransformRotate(CGAffineTransform t, CGFloat angle);
CGAffineTransform CGAffineTransformInvert(CGAffineTransform t);
CGAffineTransform CGAffineTransformConcat(CGAffineTransform t1, CGAffineTransform t2);

上边列举的前四个 API 都有 1 个类型为 CGAffineTransform 的参数 t,这四个 API 分别对 t 进行平移、缩放、旋转、求逆。

第五个相对特殊,它有两个类型为 CGAffineTransform 的参数,该函数返回值为 t1*t2 。

除了上边列举的 API,还提供有判断两个矩阵是否等价、是否为单元矩阵,对 CGPoitn

CGSizeCGRect 进行仿射变换等 API,同时有相关 API 针对 CTM 做变换。

结束了

写到这里,本文的主要内容就结束了。对,文章没有任何有深度的内容,都是线性代数的入门知识。那我为什么要写?

因为,今天在微博上看到有人这么说:

你告诉我,你先 translate 后 rotate 和 rotate 之后再 translate 效果凭什么要一样?


文中非吐槽部分的所有配图均来自苹果开发者文档。

【吐槽向】iOS 中的仿射变换的更多相关文章

  1. iOS中支付宝集成

    iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...

  2. iOS中数据库应用基础

    iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...

  3. 正则表达式在iOS中的运用

    1.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  4. iOS 中的 HotFix 方案总结详解

    相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...

  5. iOS中使用正则

    一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  6. IOS中div contenteditable=true无法输入

    在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...

  7. 谈谈iOS中的屏幕方向

    众所周知,iOS中提供了[UIDevice currentDevice].orientation与[UIApplication sharedApplication].statusBarOrientat ...

  8. iOS中assign、copy 、retain等关键字的含义

    iOS中assign.copy .retain等关键字的含义  转自:http://my.oschina.net/majiage/blog/267409 assign: 简单赋值,不更改索引计数cop ...

  9. Quartz 2D在ios中的使用简述二:创建画布

    在iOS中使用Quartz画图时,第一步就是要获取画布(图形上下文),然后再画布上做各种操作.先看下CoreGraphics.h这个头文件,就可以知道能够创建多少种上下文类型. #include &l ...

随机推荐

  1. 本博客由CSDN迁移而来,显示不正常的博文会慢慢修复!

    如题,原博客地址http://blog.csdn.net/vicjiao

  2. MacOS App代码申请管理员权限

    原文: https://jacobpan3g.github.io/cn/2018/02/07/gain-root-permission-for-mac-app/,有问题欢迎在原文评论区一起讨论交流,我 ...

  3. MFC: 获得关机消息;阻止Windows关机

    WM_QUERYENDSESSION消息是Windows向你询问Windows能否关闭,WM_ENDSESSION消息表示提示你Windows即将关闭.故当应用程序退出时, WM_QUERYENDSE ...

  4. APACHE服务器出现No input file specified.的完美解决方案

    启用REWRITE的伪静态功能的时候,首页可以访问,而访问内页的时候,就提示:“No input file specified.” 原因在于使用的PHP是fast_cgi模式,而在某些情况下,不能正确 ...

  5. linux下面的fd限制

    如果不考虑内存大小的限制,在linux下面,fd (即file descriptor)的数量来自2个限制(阈值).其一:是操作系统的限制.这个限制主要是在linux内核中,我们知道,用户程序的fope ...

  6. VxWorks 操作系统内存布局

    在VxWorks操作系统过程中可能使用到的BootRom和VxWorks内核映像本身都可以存在两种方式:压缩的和非压缩的. 1.非压缩形式 如果没有进行压缩,则只有一次重定位,即从ROM到RAM只存在 ...

  7. Struts2实现文件上传(三)

    Struts2实现文件上传 配置文件web.xml <?xml version="1.0" encoding="UTF-8"?> <web-a ...

  8. winhex中判断+MBR+DBR+EBR方法

    [/hide] 扇区开始描述). 用 winhex 做U盘免疫AUTO.INF 用WinHex制作无法修改的AutoRun.inf文件 在我们日常工作中,经常需要使用闪存(也称为U盘或者优盘)主要是A ...

  9. JVM 调优系列之图解垃圾回收

    摘要: jvm必知系列,总结一些常见jvm回收机制,方便查阅 对于调优之前,我们必须要了解其运行原理,java 的垃圾收集Garbage Collection 通常被称为"GC", ...

  10. 蒟蒻关于斜率优化DP简单的总结

    斜率优化DP 题外话 考试的时候被这个玩意弄得瑟瑟发抖 大概是yybGG的Day4 小蒟蒻表示根本不会做..... 然后自己默默地搞了一下斜率优化 这里算是开始吗?? 其实我讲的会非常非常非常简单,, ...