- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
如何仅使用对 CGAffineTransformMake() 的一次调用加上 math.h trig 函数(如 sin()、cos() 等),围绕角度为 a 的点 x、y 进行旋转的 Core Graphics 仿射变换., 并且没有其他 CG 调用。
这里的其他答案似乎是关于使用多个堆叠变换或多步变换来移动、旋转和移动,使用多个 Core Graphics 调用。这些答案不符合我的具体要求。
最佳答案
围绕点(x,y)旋转角度a对应仿射变换:
CGAffineTransform transform = CGAffineTransformMake(cos(a),sin(a),-sin(a),cos(a),x-x*cos(a)+y*sin(a),y-x*sin(a)-y*cos(a));
您可能需要插入 -a 而不是 a,具体取决于您希望顺时针还是逆时针旋转。此外,您可能需要插入 -y 而不是 y,具体取决于您的坐标系是否颠倒。
此外,您可以使用以下三行代码完成完全相同的事情:
CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);
transform = CGAffineTransformRotate(transform, a);
transform = CGAffineTransformTranslate(transform,-x,-y);
如果您将此应用到 View ,您也可以通过 CGAffineTransformMakeRotation(a) 简单地使用旋转变换,前提是您设置 View 层的 anchorPoint 属性以反射(reflect)您想要旋转的点。但是,听起来您对将此应用到 View 不感兴趣。
最后,如果您将其应用于非欧几里得二维空间,您可能根本不需要仿射变换。仿射变换是欧几里得空间的等距,这意味着它们保留了标准的欧几里得距离和角度。如果你的空间不是欧几里得,那么你想要的变换实际上可能不是仿射的,或者如果它是仿射的,旋转矩阵可能不像我上面用 sin 和 cos 写的那么简单。例如,如果您在双曲空间中,您可能需要使用双曲三角函数 sinh 和 cosh,以及公式中不同的 + 和 - 符号。
附言我还想提醒所有读到这里的人,“affine”的发音是像“ask”中的短“a”,而不是像“able”中的长“a”。我什至听到 Apple 员工在他们的 WWDC 演讲中读错了它。
关于ios - 围绕一个点旋转的一步仿射变换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8275882/
我是一名优秀的程序员,十分优秀!