【问题标题】:Decomposing CGAffineTransform in rotate, scale, and translate components在旋转、缩放和平移组件中分解 CGAffineTransform
【发布时间】:2021-11-09 14:48:54
【问题描述】:

我正在尝试将 CGAffineTransform 分解为旋转、缩放和平移组件,如下所示:

public extension CGAffineTransform {
  func rotationRadians() -> CGFloat {
      return atan2(b, a)
  }

   func translation() -> CGPoint {
      return CGPoint(x: tx, y: ty)
   }

   func scaleXY() -> CGPoint {
      let scalex = sqrt(a * a + c * c)
      let scaley = sqrt(d * d + b * b)
      return CGPoint(x: scalex, y: scaley)
    }
}

现在我通过破坏它然后从相同的组件重新构造它来尝试随机变换的代码,但无论我在连接中使用什么顺序,答案都不会相同。不知道我做错了什么。

   let randomTransform = __CGAffineTransformMake(2.078, 3.459, 1.676, 0, 591, 397)
   let rotationRadians = randomTransform.rotationRadians()
   let scaleXY = randomTransform.scaleXY()
   let translation = randomTransform.translation()
                
   let translationTransform = CGAffineTransform(translationX: translation.x, y: translation.y)
   let scalingTransform = CGAffineTransform(scaleX: scaleXY.x, y: scaleXY.y)
   let rotationTransform = CGAffineTransform(rotationAngle: rotationRadians)
                
   var newTransform =  rotationTransform.concatenating(scalingTransform).concatenating(translationTransform)
                
   NSLog("New transform \(newTransform), original \(randomTransform)")
             

这是控制台的输出:

New transform CGAffineTransform(a: 1.374790977280978, b: 2.965084308709465, c: -2.2884513909600113, d: 1.7812793274062642, tx: 591.0, ty: 397.0), original CGAffineTransform(a: 2.078, b: 3.459, c: 1.676, d: 0.0, tx: 591.0, ty: 397.0)

【问题讨论】:

    标签: ios swift uikit core-graphics cgaffinetransform


    【解决方案1】:

    您尝试做的事情基本上是不可能的,尽管在某些情况下使用一些复杂的数学技术可能很容易做到。示例见http://callumhay.blogspot.com/2010/10/decomposing-affine-transforms.html

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多