图像应该缩放和变换。
根据变换矩阵的组成方式,我得到不同的结果:
{'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不会产生相同的结果,因为将它们加在一起时矩阵顺序无关紧要?
答案 0 :(得分:2)
巧合的是,缩放矩阵和转换矩阵的乘积和加法结果相同。
在一般情况下,scaledBy
和translatedBy
并不意味着加法,它们是连接两个变换(矩阵乘法)的简写。矩阵乘法仅可用于对角矩阵(对角线上的矩阵仅具有非零值的矩阵),因此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中颠倒了顺序,所以产生了不同的结果。