iOS中的CTM变换与仿射变换(用于平移、旋转、缩放)

iOS中的CTM变换与仿射变换(用于平移、旋转、缩放),ios,transformation,cgaffinetransform,Ios,Transformation,Cgaffinetransform,我阅读了Quartz 2D编程指南中的文档。在其中,似乎有两种方法可以进行转换。一种方法是修改电流变换矩阵(CTM)。它有如下方法: cgcontexttranslatecm CGContextRotateCTM CGContextScaleCTM 另一种方法是使用仿射变换。它有如下方法: CGAffineTransformTranslate CGAffineTransformRotate CGAffineTransformScale 文件状态 Quartz中可用的仿射变换函数在矩阵上操

我阅读了Quartz 2D编程指南中的文档。在其中,似乎有两种方法可以进行转换。一种方法是修改电流变换矩阵(CTM)。它有如下方法:

  • cgcontexttranslatecm
  • CGContextRotateCTM
  • CGContextScaleCTM
另一种方法是使用仿射变换。它有如下方法:

  • CGAffineTransformTranslate
  • CGAffineTransformRotate
  • CGAffineTransformScale
文件状态

Quartz中可用的仿射变换函数在矩阵上操作,而不是在CTM上


但我不明白这实际上对我有什么影响。似乎我可以用这两种方法得到相同的结果。何时应使用CTM变换以及何时应使用仿射变换?

CTM是当前变换矩阵,CTM方法将对当前矩阵进行操作

另一个版本的函数将在给定的矩阵上进行转换,这意味着您需要指定要转换的矩阵。完成此操作后,您可以以任何方式将转换应用于CTM,或将其用于任何其他目的

例如,这两个操作是相同的:

CGContextTranslateCTM(context, 10, 10);
仿射:

CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformTranslate(transform, 10, 10);
CGContextConcatCTM(context, transform);

正如您所看到的,第一种方法或多或少只是一种方便,因此您不需要编写太多代码。

我真的想不出什么时候需要使用仿射变换的例子。有吗?嗯,您可能需要一些自定义方法,例如上下文中的倒矩阵或插值。否则,您可能会从其他组件(如UIView)或其他上下文或其他方式获取它。。。无论如何,我能想到很多原因。你能详细解释一下参数吗?除了文档之外,你对其中哪一个感兴趣?转换矩阵A是经过修改的恒等式,以便将最后一行(某些实现的列)设置为转换向量,其中给定矩阵B乘以BA或AB(遗憾的是,取决于实现),但2个参数是发生对象转换的2d向量的表示。。。换句话说,如果你是一个物体,你被称为ti translate(x,y),这意味着无论你有多小或者你面对的是什么方向,都要向右走x步,向上走y步。