Quartz 2D 绘制模型定义了两种独立的坐标空间:用户空间(用于表现文档页)和设备空间(用于表现设备的本地分辨率)。用户坐标空间用浮点数表示坐标,与设备空间的像素分辨率没有关系。当我们需要一个点或者
  • 变换操作函数概览
  • 如何修改CTM
  • 如何创建一个仿射变换
  • 如何选择两个相同的变换
  • 如何获取user-to-device-space变换
  • Quartz变换函数
    我们可能使用Quartz内置的变换函数方便的平移、旋转和缩放我们的绘图。只需要短短几行代码,我们便可以按顺序应用变换或结合使用变换。图5-1显示了缩放和旋转一幅
    复制代码
  • CGContextDrawImage (myContext, rect, myImage);

  • 复制代码
  • CGContextTranslateCTM (myContext, 100, 50);

  • 复制代码
  • CGContextRotateCTM (myContext, radians(–45.));

  • 复制代码
  • #include <math.h>
  • static inline double radians (double degrees) {return degrees * M_PI/180;}
  • 缩放操作根据指定的x, y因子来改变坐标空间的大小,从而放大或缩小图像。x, y因子的大小决定了新的坐标空间是否比原始坐标空间大或者小。另外,通过指定x因子为负数,可以倒转x轴,同样可以指定y因子为负数来倒转y轴。通过调用CGContextScaleCTM函数来指定x, y缩放因子。图5-5显示了指定x因子为0.5,y因子为0.75后的缩放效果。代码如下:
    复制代码
  • CGContextScaleCTM (myContext, .5, .75);

  • 复制代码
  • CGContextTranslateCTM (myContext, w,h);
  • CGContextRotateCTM (myContext, radians(-180.));

  • 复制代码
  • CGContextTranslateCTM (myContext, w/4, 0);
  • CGContextScaleCTM (myContext, .25,  .5);
  • CGContextRotateCTM (myContext, radians ( 22.));

  • 复制代码
  • CGContextRotateCTM (myContext, radians ( 22.));
  • CGContextScaleCTM (myContext, .25,  .5);
  • CGContextTranslateCTM (myContext, w/4, 0);

  • 函数
    用途
    CGAffineTransformMakeTranslation
    通过指定x, y值来创建一个平移矩阵
    CGAffineTransformTranslate
    在已存在的矩阵中使用平移
    CGAffineTransformMakeRotation
    通过指定角度来创建一个旋转矩阵
    CGAffineTransformRotate
    在已存在的矩阵中使用旋转
    CGAffineTransformMakeScale
    通过指定x, y缩放因子来创建一个缩放矩阵
    CGAffineTransformScale
    在已存在的矩阵中使用缩放 Quartz同样提供了一个仿射变换函数(CGAffineTransformInvert)来倒置矩阵。倒置操作通常用于在变换对象中提供点的倒置变换。当我们需要恢复一个被矩阵变换的值时,可以使用倒置操作。将值与倒置矩阵相乘,就可得到原先的值。我们通常不需要倒置操作,因为我们可以通过保存和恢复图形状态来倒置CTM的效果。
    在一些情况下,我们可能不需要变换整修空间,而只是一个点或一个大小。我们通过调用CGPointApplyAffineTransform在CGPoint结构上执行变换操作。调用CGSizeApplyAffineTransform在CGSize结构上执行变换操作。调用CGRectApplyAffineTransform在CGRect结构上执行变换操作。CGRectApplyAffineTransform返回一个最小的矩形,该矩形包含了被传递给CGRectApplyAffineTransform的矩形对象的角点。如果矩形上的仿射变换操作只有缩放和平移操作,则返回的矩形与四个变换后的角组成的矩形是一致的。
    可以通过调用函数CGAffineTransformMake来创建一个新的仿射变换,但与其它函数不同的是,它需要提供一个矩阵实体。


    评价仿射变换
    我们可以通过调用CGAffineTransformEqualToTransform函数来决定一个仿射变换是否与另一个相同。如果两个变换相同,则返回true;否则返回false。
    函数CGAffineTransformIsIdentity用于确认一个变换是否是单位变换。单位变换没有平移、缩放和旋转操作。Quartz常量CGAffineTransformIdentity表示一个单位变换。
    获取用户空间到设备空间的变换
    当使用Quartz 2D时,我们只是在用户空间下工作。Quartz为我们处理用户空间和设备空间的转换。如果我们的应用程序需要获取Quartz转换用户空间和设备空间的仿射变换,我们可以调用函数CGContextGetUserSpaceToDeviceSpaceTransform。
    Quartz提供了一系列的函数来转换用户空间和设备空间的几何体。我们会发现这些函数使用赶来比使用CGContextGetUserSpaceToDeviceSpaceTransform函数返回的仿射变换更好用。
    • 点:函数CGContextConvertPointToDeviceSpace和CGContextConvertPointToUserSpace将一个CGPoint数据结构从一个空间变换到另一个空间。
    • 大小:函数CGContextConvertSizeToDeviceSpace和CGContextConvertSizeToUserSpace将一个CGSize数据结构从一个空间变换到另一个空间。
    • 矩形:函数CGContextConvertRectToDeviceSpace和CGContextConvertRectToUserSpace将一个CGPoint数据结构从一个空间变换到另一个空间。

    相关文章: