【发布时间】:2018-02-02 17:44:17
【问题描述】:
在使用 Playground 时,我发现了一些意想不到的场景
我正在将 square(w: 100, h: 100) 从 (0,0) 转换为 (150, 150) 并将其旋转 .pi。我同时使用连接来平移和旋转正方形,所以这很令人惊讶,但是当我切换调用平移和旋转的顺序时,正方形会以不同的方式移动
当我在翻译之前旋转正方形时,正方形将从(0,0) 移动到(150, 150),正如预测的那样
但是,当我在旋转正方形之前进行翻译时,正方形会从 (0,0) 移动并向上旋转并离开屏幕,这对我来说在逻辑上没有意义,有人可以尝试向我解释一下吗?
【问题讨论】:
-
应用仿射变换时,操作顺序很重要。我不记得从类中提供完整的答案,也找不到包含 iOS 示例的文章,但这篇文章 - docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/… - 解释了一般概念,可以帮助您从概念上清除一些东西。
-
嗯,这是有道理的,但是,当我运行代码时,它与该站点的解释完全相反。但是我可能只是误解了这里的一些关键,谢谢!
-
不同的图形系统使用不同的坐标系。我没有特别研究过 Windows 图形系统,但如果您看到完全相反的行为,那么很可能是左手/右手旋转差异,或者左下角与左上角的原点差异。我的建议(不久前我自己重新学习了所有这些)是回到底层的线性代数:youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab(视频 1-5 足以用于 CGGraphics)
-
如果你想让你的转换更容易推理,关键是把对象的中心放在原点(而不是把角放在原点)。当你这样做时,所有的转换都会按照你可能想要的方式工作。
-
不显示代码图片。显示代码。
标签: ios uiview rotation concatenation swift-playground