【问题标题】:CTM transforms vs Affine Transforms in iOS (for translate, rotate, scale)iOS 中的 CTM 变换与仿射变换(用于平移、旋转、缩放)
【发布时间】:2015-06-10 12:51:27
【问题描述】:

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

  • CGContextTranslateCTM
  • CGContextRotateCTM
  • CGContextScaleCTM

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

  • CGAffineTransformTranslate
  • CGAffineTransformRotate
  • CGAffineTransformScale

文档状态

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

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

【问题讨论】:

    标签: ios transformation cgaffinetransform


    【解决方案1】:

    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 步,并且向上走 x 步无论你有多小,无论你面对什么方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2014-09-28
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    相关资源
    最近更新 更多