iOS--坐标变换Quartz 2D中的CGContextTranslateCTM、CGContextScaleCTM、CGContextRotateCTM、CGContextConcatCTM等

转载 2015年07月08日 17:25:53


原文 转自 大牛的博客 :http://blog.csdn.net/gauss_li/article/details/44196025  

(mark 下来 学习总结,希望大家尊重版权 )

在iOS中,Quartz 2D提供了坐标变换支持。

一、特殊的坐标变换(平移、缩放、旋转)

1. - void CGContextTranslateCTM ( CGContextRef c, CGFloat tx, CGFloat ty ):平移坐标系统。 

该方法相当于把原来位于 (0, 0) 位置的坐标原点平移到 (tx, ty) 点。在平移后的坐标系统上绘制图形时,所有坐标点的 X 坐标都相当于增加了 tx,所有点的 Y 坐标都相当于增加了 ty。


2. - void CGContextScaleCTM ( CGContextRef c, CGFloat sx, CGFloat sy ):缩放坐标系统。

该方法控制坐标系统水平方向上缩放 sx,垂直方向上缩放 sy。在缩放后的坐标系统上绘制图形时,所有点的 X 坐标都相当于乘以 sx 因子,所有点的 Y 坐标都相当于乘以 sy 因子。


3. - void CGContextRotateCTM ( CGContextRef c, CGFloat angle ):旋转坐标系统。

该方法控制坐标系统旋转 angle 弧度。在缩放后的坐标系统上绘制图形时,所有坐标点的 X、Y 坐标都相当于旋转了 angle弧度之后的坐标。


为了让开发者在进行坐标变换时无须计算多次坐标变换后的累加结果,Quartz 2D还提供了如下两个方法来保存、恢复绘图状态。

- void CGContextSaveGState ( CGContextRef c ):保存当前的绘图状态。 

- void CGContextRestoreGState ( CGContextRef c ):恢复之前保存的绘图状态。

需要说明的是,CGContextSaveGState() 函数保存的绘图状态,不仅包括当前坐标系统的状态,也包括当前设置的填充风格、线条风格、阴影风格等各种绘图状态。但 CGContextSaveGState() 函数不会保存当前绘制的图形。


二、通用的坐标变换(通过变换矩阵进行变换)

除了以上3个坐标转换方法之外,Quartz 2D提供更通用的坐标转换方法。

void CGContextConcatCTM ( CGContextRef c, CGAffineTransform transform ):使用 transform 变换矩阵对 CGContextRef 的坐标系统执行变换,通过使用坐标矩阵可以对坐标系统执行任意变换。

CGAffineTransform CGContextGetCTM ( CGContextRef c ):获取CGContextRef的坐标系统的变换矩阵。


上述两个方法中都涉及一个关于矩阵的API:CGAffineTransform。

创建CGAffineTransform的4种方式:

1. CGAffineTransform CGAffineTransformMakeTranslation ( CGFloat tx, CGFloat ty ):创建进行位移变换的变换矩阵。该函数的两个参数与前面介绍的位移变换的两个参数的作用相同。

2. CGAffineTransform CGAffineTransformMakeScale ( CGFloat sx, CGFloat sy ):创建进行缩放变换的变换矩阵。该函数的两个参数与前面介绍的缩放变换的两个参数的作用相同。

3. CGAffineTransform CGAffineTransformMakeRotation ( CGFloat angle ):创建进行旋转变换的变换矩阵。该函数的参数与前面介绍的旋转变换的参数的作用相同。

4. CGAffineTransform CGAffineTransformMake ( CGFloat a, CGFloat b, CGFloat c, CGFloat d, CGFloat tx, CGFloat ty ):该函数使用自定义变换矩阵执行变换。

其中 ( a, b, c, d )会形成变换矩阵,tx、ty为横向和纵向的位移,变换后结果应该为:

a, b

(x, y) x (c, d) + (tx, ty) = (xa x yc, xb x yd) + (tx, ty) = (xa x yc + , xb x yd + ty)。

一般坐标变换矩阵

1)水平镜像(绕 Y 轴做对称变化):CGAffineTransformMake ( -1, 0, 0, 1, 0, 0 )

-1, 0

0, 1

2) 垂直镜像(绕 X 轴做对称变化):CGAffineTransformMake ( 1, 0, 0, -1, 0, 0 )

1, 0

0, -1

3)绕 x=y轴做对称变化:CGAffineTransformMake ( 0, 1, 1, 0, 0, 0 )

0, 1

1, 0

4)绕x =-y轴做对称变化:CGAffineTransformMake ( 0, -1, -1, 0, 0, 0 )

0, -1

-1, 0

5)做“水平倾斜”的变换,此时 Y 坐标无须变换,只要将 X 坐标增加 tan( angle ) x X 即可(angle 代表顺时针转过的角度):CGAffineTransformMake ( 1, 0, tan(angle), 1, 0, 0 )

1, 0

tan(angle), 1

6)做“垂直倾斜”的变换,此时 X 坐标无须变换,只要将 Y 坐标减少 tan( angle ) x X 即可:CGAffineTransformMake ( 1, -tan(angle), 0, 1 )

1, -tan(angle)

0, 1


三、复合矩阵坐标变换

1. CGAffineTransform CGAffineTransformTranslate ( CGAffineTransform t, CGFloat tx, CGFloat, ty ):对已有的变换矩阵 t 额外增加位移变换。

2. CGAffineTransform CGAffineTransformScale ( CGAffineTransform t, CGFloat sx, CGFloat sy ):对已有的变换矩阵 t 额外增加缩放变换。

3. CGAffineTransform CGAffineTransformRotate ( CGAffineTransform t, CGFloat angle ):对已有的变换矩阵 t 额外增加旋转变换。

4. CGAffineTransform CGAffineTransformInvert ( CGAffineTransform t ):对已有的变换矩阵 t 进行反转。

5. CGAffineTransform CGAffineTransformConcat ( CGAffineTransform t1, CGAffineTransform t2 ):将两个变换矩阵进行叠加。


四、对CGPoint、CGSize和CGRect进行坐标变换

1. CGPoint CGPointApplyAffineTransform ( CGPoint point, CGAffineTransform t ):对指定的CGPoint执行变换,函数返回坐标变换后的CGPoint。

2. CGSize CGSizeApplyAffineTransform ( CGSize size, CGAffineTransform t ):对指定的CGSize执行变换,函数返回坐标变换后的CGSize。

3. CGRect CGRectApplyAffineTransform ( CGRect rect, CGAffineTransform t ):对指定的CGRect执行变换,函数返回坐标变换后的CGRect。


五、对UIView进行坐标变换

UIView提供了一个transform属性,该属性支持设置CGAffineTransform变换矩阵,这样就可对UIView控件本身进行坐标变换,从而改变UIView控件本身的外观。

iOS--坐标变换Quartz 2D中的CGContextTranslateCTM、CGContextScaleCTM、CGContextRotateCTM、CGContextConcatCTM等

在iOS中,Quartz 2D提供了坐标变换支持 CGContextTranslateCTM、CGContextScaleCTM、CGContextRotateCTM、CGContextConcatC...
  • gauss_li
  • gauss_li
  • 2015年03月11日 11:05
  • 4841

CGContextTranslateCTM,CGContextScaleCTM,CGContextRotateCTM详解

在看到这几个函数的第一感觉是什么 translate 移动 scale 缩放 rotate 旋转 ,对,这就是我的第一感觉,先知道这些方法的意思是什么,至于怎么用,从文档中我们也不难发现,是这样的: ...
  • baidu_31683691
  • baidu_31683691
  • 2016年08月05日 17:08
  • 2540

CoreGraphics QuartzCore CGContextTranslateCTM 用法

CoreGraphics.h 一些常用旋转常量 #define M_E 2.71828182845904523536028747135266250 e 
#define M_LOG2E ...
  • sqc3375177
  • sqc3375177
  • 2014年05月13日 14:31
  • 16809

CGContext坐标变换

讨论 http://www.cnblogs.com/delonchen/archive/2011/06/12/CGContextDrawImage.html 这个函数绘制图片,但坐...
  • xcysuccess3
  • xcysuccess3
  • 2012年10月22日 19:45
  • 5275

iOS--坐标变换Quartz 2D中的CGContextTranslateCTM、CGContextScaleCTM、

转自http://www.aichengxu.com/view/46588
  • baidu_29820889
  • baidu_29820889
  • 2016年07月01日 10:44
  • 105

iOS开发 : 坐标变换Quartz 2D中的CGContextTranslateCTM、CGContextScaleCTM

iOS--坐标变换Quartz 2D中的CGContextTranslateCTM、CGContextScaleCTM、,有需要的朋友可以参考下。 iOS讲义总结 在iOS中,Quartz 2...
  • tiebanshao
  • tiebanshao
  • 2016年01月25日 17:30
  • 268

ios 绘图笔记--CGContextTranslateCTM

我们在使用“CGContextShowTextAtPoint”,经常会遇到字体翻转问题。CGContextShowTextAtPoint word upside.这个问题可以通过    CGConte...
  • ranchunfeng
  • ranchunfeng
  • 2011年07月26日 14:05
  • 6255

iOS 2D绘图详解(Quartz 2D)之Transform(CTM,Translate,Rotate,Scale)

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow前三篇基础博客路径 iOS 2D绘图详解(...
  • Hello_Hwc
  • Hello_Hwc
  • 2015年10月27日 11:52
  • 2141

CGContextScaleCTM,CGContextTranslateCTM

http://www.cnblogs.com/wendingding/p/3782551.html
  • sinat_33917964
  • sinat_33917964
  • 2016年04月07日 23:13
  • 102

Quartz2D——旋转、平移、缩放、剪切圆形图片

注:旋转、平移、缩放,必须放在画图之前 平移: // 获取上下文 CGContextRef context = UIGraphicsGetCurrentContext(); ...
  • yejiexiaobai
  • yejiexiaobai
  • 2015年10月31日 10:08
  • 467
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS--坐标变换Quartz 2D中的CGContextTranslateCTM、CGContextScaleCTM、CGContextRotateCTM、CGContextConcatCTM等
举报原因:
原因补充:

(最多只允许输入30个字)