【吐槽向】iOS 中的仿射变换
什么是仿射变换矩阵
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
CGSize、CGRect 进行仿射变换等 API,同时有相关 API 针对 CTM 做变换。
结束了
写到这里,本文的主要内容就结束了。对,文章没有任何有深度的内容,都是线性代数的入门知识。那我为什么要写?
因为,今天在微博上看到有人这么说:

你告诉我,你先 translate 后 rotate 和 rotate 之后再 translate 效果凭什么要一样?
文中非吐槽部分的所有配图均来自苹果开发者文档。
【吐槽向】iOS 中的仿射变换的更多相关文章
- iOS中支付宝集成
iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...
- iOS中数据库应用基础
iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...
- 正则表达式在iOS中的运用
1.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...
- iOS 中的 HotFix 方案总结详解
相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...
- iOS中使用正则
一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...
- IOS中div contenteditable=true无法输入
在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...
- 谈谈iOS中的屏幕方向
众所周知,iOS中提供了[UIDevice currentDevice].orientation与[UIApplication sharedApplication].statusBarOrientat ...
- iOS中assign、copy 、retain等关键字的含义
iOS中assign.copy .retain等关键字的含义 转自:http://my.oschina.net/majiage/blog/267409 assign: 简单赋值,不更改索引计数cop ...
- Quartz 2D在ios中的使用简述二:创建画布
在iOS中使用Quartz画图时,第一步就是要获取画布(图形上下文),然后再画布上做各种操作.先看下CoreGraphics.h这个头文件,就可以知道能够创建多少种上下文类型. #include &l ...
随机推荐
- Dockerfile 编译安装mysql5.7 千万不要执行.只是记录一下编译安装罢了
开启所有核心make 20G 内存都不够玩,跑3-4个核心吧,还好. 最后的出来的镜像3G多,百思不得其解,看了官方的Dockerfile,也没什么特别,就是 apt 或者 yum.好吧,不知做了什 ...
- java:替换字符串中的ASCII码
可对照查看网盘ASCII表http://yunpan.cn/cyxg4wQjQaGEQ (提取码:8b29) public static void main(String[] args) { // / ...
- Ubuntu版本更替所引发的“血案”
Ubuntu版本更替所引发的"血案" 今天,我兴致很高的装了双系统,并且配置了Linux的网络,接下来就是安装一些软件,来实现我想达到的功能了,结果被一个小小的命令卡的 ...
- FusionCharts 2D柱状图和折线图的组合图调试错误
在设计FusionCharts 2D柱状图和折线图的组合图的时候,我发现不管怎么重启服务器,组合图就是不出来.后来,我通过调试发现我犯了一个致命的错误,运用平常一贯的思维,认为3D图有这种类型,那么2 ...
- R语言︱情感分析—词典型代码实践(最基础)(一)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:词典型情感分析对词典要求极高,词典中 ...
- Java中的字符串拼接
Java中的字符串拼接 1.设计源码 /** * @Title:IndexOf.java * @Package:com.you.freemarker.model * @Description: * @ ...
- 百度地图JavaScript API本地搜索的结果面板
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- Adobe RIA 开发工程师认证考试大纲
AdobeRIA 开发工程师认证考试大纲 考题数量:共90道题,考试通过正确率:60% 考试时间:120分钟 试题种类:单选题.多选题和判断题 1. Adobe RIA基础知识(2道题) ...
- Linux显示用户的ID
Linux显示用户的ID youhaidong@youhaidong-ThinkPad-Edge-E545:~$ id uid=1000(youhaidong) gid=1000(youhaidong ...
- INS-30002 口令和确认口令不同
1.错误描述 2.错误原因 由截图上的提示,可以看出是管理口令和确认口令不一致 3.解决办法 重新输入密码