如何正确组合CGAffineTransform矩阵?

时间:2018-09-25 02:11:35

标签: ios swift matrix cgaffinetransform

图像应该缩放和变换。

根据变换矩阵的组成方式,我得到不同的结果:

{'access_token': 'my_token', 'batch': '[{"body": "limit=10&fields=id,type,message", "method": "GET", "relative_url": "/cnn/posts"}, {"body": "limit=10&fields=id,type,message", "method": "GET", "relative_url": "/cocacolaindia/posts"}]'}

如果// A) This produces the desired result, scales the image and translates the image independently from each other let transform = CGAffineTransform(translationX: translation.x, y: translation.y).scaledBy(x: scale.width, y: scale.height) // B) This also produces the desired result let scaleTransform = CGAffineTransform(scaleX: scale.width, y: scale.height) let translateTransform = CGAffineTransform(translationX: translation.x, y: translation.y) let transform = scaleTransform.concatenating(translateTransform) // C) This does not produce the desired result, it also scales the translation, so a 10x scale results in a 10x translation let transform = CGAffineTransform(scaleX: scale.width, y: scale.height).translatedBy(x: translation.x, y: translation.y) // Transform image image = image.transformed(by: transform) 表示相乘,而.concatenating.scaledBy表示将两个矩阵相加,那么为什么A和C不会产生相同的结果,因为将它们加在一起时矩阵顺序无关紧要?

2 个答案:

答案 0 :(得分:2)

巧合的是,缩放矩阵和转换矩阵的乘积和加法结果相同。

在一般情况下,scaledBytranslatedBy并不意味着加法,它们是连接两个变换(矩阵乘法)的简写。矩阵乘法仅可用于对角矩阵(对角线上的矩阵仅具有非零值的矩阵),因此S * T通常与T * S不同。

查找$(xcrun --show-sdk-path)/System/Library/Frameworks/CoreGraphics.framework/Headers/CGAffineTransform.h中每个函数的作用:

  • CGAffineTransformTranslate:t'= [1 0 0 1 tx ty] * t
  • CGAffineTransformScale:t'= [sx 0 0 sy 0 0] * t
  • CGAffineTransformRotate:t'= [cos(角度)sin(角度)-sin(角度)cos(角度)0 0] * t
  • CGAffineTransformConcat:t'= t1 * t2

这意味着,当您使用CGAffineTransformConcat时,t1必须是您要应用的转换,而t2必须是您要转换的矩阵。换句话说,scale.translatedBy等效于concat(translation, scale),而不是concat(scale, translation)。使用concatenate作为方法时,由于其数学定义,这使操作向后看。

答案 1 :(得分:0)

除了@zneak所说的以外,矩阵运算的顺序也很重要,因为矩阵乘法(级联)不是可交换的。通常就是A * B≠B * A。

由于在C中颠倒了顺序,所以产生了不同的结果。