【问题标题】:CGAffineTransform concatenation: appropriate order of transformationsCGAffineTransform 连接:适当的转换顺序
【发布时间】:2018-04-18 22:37:10
【问题描述】:

我知道,每当我们想一次对一个点应用一系列变换时,我们必须指定与我们想要感知的方向相反的序列。如果我想平移(T)然后旋转(R)一个点x,我们需要以连接矩阵RT结束,那么每个点都被转换为(RT)x

Apple Transform 文档显示 CGAffineTransform 作为上述表达式的转置版本工作。即不是将一个点转换为 Ax,因为 A 是任何变换矩阵,而是将其转换为 xB,因为 BA的转置。

另外,CGAffineTransform.concatenating(T2) 文档指出它向右堆叠变换,以 T1 * T2 形式的变换矩阵结束。

现在我有什么顾虑?如果想要translate(T) 和rotate(R) 的一系列转换,我可以调用T.concatenating(R) 导致转换 TR,然后将点转换为xTR,似乎必须尊重顺序,但实际上我得到了错误的结果(至少我是这样认为的),我希望图像 A 但得到 B,

它们似乎将点转换为 TRx,但这与文档相矛盾,并且当您将转换 TR 应用于@987654324 的点时,结果也不匹配@也符合xTR的顺序。

这是为什么呢?关于转换在 iOS 中的工作方式,我缺少什么?

【问题讨论】:

    标签: ios swift cgaffinetransform


    【解决方案1】:

    很难看出这里的问题是什么,因为你已经回答过了。基本上,调用concatenating 时必须使用的顺序与链接转换时使用的顺序相反。例如:

    v2.transform = 
         CGAffineTransform(rotationAngle: 45 * .pi/180).translatedBy(x: 100, y: 0)
    

    在此屏幕截图中,v2 是绿色视图,并从紫色视图所在的位置开始:

    如果你想用concatenating 来做这件事,你会说:

    let r = CGAffineTransform(rotationAngle: 45 * .pi/180)
    let t = CGAffineTransform(translationX:100, y:0)
    v2.transform = t.concatenating(r) // not r.concatenating(t)
    

    【讨论】:

    【解决方案2】:

    如果我没记错的话,您的困惑不在于操作顺序,而在于旋转变换。旋转不是围绕对象的中心进行,而是围绕框架的原点进行,框架的原点保持固定不变。当您旋转一个不在框架原点居中的对象时,它会像时钟指针的末端一样围绕旋转。要实现图像 A,您必须

    1. 平移您的对象,使您希望旋转它的点(可能是它的中心)位于原点。
    2. 旋转对象。
    3. 将其翻译到所需位置。

    【讨论】:

    • 感谢您的回答,转换已经来自对象中心并且您提到的步骤已经完成,问题是我想要翻译->然后->旋转,所以我得到图像 A,但实际上我得到图像 B,这是旋转->然后->翻译的结果。 T.concatenating(R) 应该产生一个矩阵 TR,它像图像 A 一样变换点,但结果是 B。
    【解决方案3】:
        let rotationAngle           = CGFloat.pi / 4
        let slidingLength : CGFloat = 50
        let duration                = 0.3
        UIView.animate(withDuration: duration) { [weak self] in
            self?.slidingView.transform = CGAffineTransform(rotationAngle: rotationAngle)
            self?.slidingView.center.x += slidingLength
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      相关资源
      最近更新 更多