gpt4 book ai didi

ios - 围绕一个点旋转的一步仿射变换?

转载 作者:IT王子 更新时间:2023-10-29 07:39:22 25 4
gpt4 key购买 nike

如何仅使用对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com