绕一个点旋转一步仿射变换?

我怎样才能做一个核心graphics仿射变换围绕angular度的一个点x,y旋转,使用只有一个调用CGAffineTransformMake()加上math.h trig函数,如sin(),cos()等,和没有其他CG电话。

其他答案似乎是使用多个Core Graphics调用使用多个堆栈变换或多步骤变换来移动,旋转和移动。 这些答案不符合我的具体要求。

围绕点(x,y)的angular度α的旋转对应于仿射变换:

 CGAffineTransform transform = CGAffineTransformMake(cos(a),sin(a),-sin(a),cos(a),xx*cos(a)+y*sin(a),yx*sin(a)-y*cos(a)); 

您可能需要插入-a而不是取决于是否要旋转顺时针或逆时针。 此外,您可能需要插入-y而不是y,具体取决于您的坐标系是否颠倒。

另外,你可以用三行代码完成同样的事情:

 CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y); transform = CGAffineTransformRotate(transform, a); transform = CGAffineTransformTranslate(transform,-x,-y); 

如果你将它应用到视图中,只要设置视图的图层的anchorPoint属性以反映你想要旋转的点,就可以简单地通过CGAffineTransformMakeRotation(a)使用旋转变换。 但是,听起来像你没有兴趣将其应用于视图。

最后,如果你将这个应用到非欧几里德二维空间,你可能根本不需要仿射变换。 仿射变换是欧几里得空间的等距,意味着它们保持标准的欧氏距离以及angular度。 如果你的空间不是欧几里德,那么你想要的变换可能实际上不是仿射的,或者如果是仿射的,旋转的matrix可能不像我上面用sin和cos写的那样简单。 例如,如果您处于双曲空间中,则可能需要使用双曲三angular函数sinh和cosh,以及公式中的不同的+和 – 符号。

PS我还想提醒任何人,读到这个“affine”,在“ask”中用短“a”来发音,而不是在“able”中用“a”来表示。 我甚至在苹果的WWDC会谈中听到苹果员工的错误报道。

对于像我这样的人来说,为了find一个完整的解决scheme来寻找旋转图像和适当调整图像的方法是很困难的,为了填充容纳的框架,几个小时之后,这是我获得的最完整和完美的解决scheme。

这里的诀窍是在涉及任何转换(包括缩放和旋转)之前转换参考点。 之后,你必须连接两个变换,以获得一个完整的仿射变换。

我已经将整个解决scheme打包在CIFilter子类中,您可以在这里find 。

遵循相关部分的代码:

 CGFloat a = _inputDegree.floatValue; CGFloat x = _inputImage.extent.size.width/2.0; CGFloat y = _inputImage.extent.size.height/2.0; CGFloat scale = [self calculateScaleForAngle:GLKMathRadiansToDegrees(a)]; CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y); transform = CGAffineTransformRotate(transform, a); transform = CGAffineTransformTranslate(transform,-x,-y); CGAffineTransform transform2 = CGAffineTransformMakeTranslation(x, y); transform2 = CGAffineTransformScale(transform2, scale, scale); transform2 = CGAffineTransformTranslate(transform2,-x,-y); CGAffineTransform concate = CGAffineTransformConcat(transform2, transform); 

看看这个链接: 围绕一个点旋转iPhone视图 。 它可以帮助你。 在文章的底部,有一个标题为“更改锚点”的部分。 这可能是最适合你的需求的,尽pipe为了不抵消这个观点,必须做一些补偿。