Dan*_*e P 5 cgaffinetransform swift
在下面的这个例子中,为什么第一个矩阵等于第三个,而不是第二个?
let t1 = CGAffineTransform(scaleX: 2, y: 2)
.concatenating(CGAffineTransform(translationX: 50, y: 50))
let t2 = CGAffineTransform(scaleX: 2, y: 2).translatedBy(x: 50, y: 50)
let t3 = CGAffineTransform(translationX: 50, y: 50).scaledBy(x: 2, y: 2)
Run Code Online (Sandbox Code Playgroud)
为了避免与名称混淆,我将变量从重命名tN为rN:
let r1 = CGAffineTransform(scaleX: 2, y: 2)\n .concatenating(CGAffineTransform(translationX: 50, y: 50))\n\nlet r2 = CGAffineTransform(scaleX: 2, y: 2).translatedBy(x: 50, y: 50)\n\nlet r3 = CGAffineTransform(translationX: 50, y: 50).scaledBy(x: 2, y: 2)\nRun Code Online (Sandbox Code Playgroud)\n\n确实看起来倒退了。而且这些方法的文档并没有真正清楚地说明除函数之外的任何数学运算concatenating。
正如您在文档中看到的concatenating:
\n\n\n一个新的仿射变换矩阵。即t\xe2\x80\x99 = t1*t2。
\n
在变量的示例代码中,r1这是scale * translate.
这部分似乎很清楚。
\n\n至于translatedBy和scaledBy函数需要查看 Objective-C 头文件中CGAffineTransformTranslate和对应的函数CGAffineTransformScale。
给CGAffineTransformTranslate你看看评论:
\n\n\n将 t 翻译 (tx, ty) 并返回结果:\n t' = [ 1 0 0 1 tx ty ] * t
\n
给CGAffineTransformScale你看:
\n\n\n按 (sx, sy) 缩放 t 并返回结果:\n t' = [ sx 0 0 sy 0 0 ] * t
\n
该信息告诉我们,let r = t.translatedBy(t2)相当于t' = t2 * t。当然scaledBy和rotatedBy是相似的。
这意味着您的代码中的这一行:
\n\nlet r3 = CGAffineTransform(translationX: 50, y: 50).scaledBy(x: 2, y: 2)\nRun Code Online (Sandbox Code Playgroud)\n\n是相同的:
\n\nlet r3 = CGAffineTransform(scaleX: 2, y: 2).concatenating(CGAffineTransform(translationX: 50, y: 50))\nRun Code Online (Sandbox Code Playgroud)\n\n并不是:
\n\nlet r3 = CGAffineTransform(translationX: 50, y: 50).concatenating(CGAffineTransform(scaleX: 2, y: 2))\nRun Code Online (Sandbox Code Playgroud)\n\n这就是为什么在您的示例代码中,r1等于r3。像英语一样阅读第二两行会导致矩阵以相反的顺序连接的想法。
| 归档时间: |
|
| 查看次数: |
761 次 |
| 最近记录: |