旋转超视图后获取实际角度

时间:2016-09-18 02:48:13

标签: ios objective-c rotatetransform

我有5个子视图(白色)添加到超级视图(灰色),当我旋转超级视图时,我想知道每个子视图与红色圆圈的角度(如1和2)。子视图和红色圆圈在同一个圆圈上)

开始位置 enter image description here

旋转位置 enter image description here

enter image description here

3 个答案:

答案 0 :(得分:0)

根据您的评论,您似乎想要确定给定旋转的五个圆的中心坐标。这些中心都将躺在一个圆圈上。因此,您的问题归结为半径为 r 的圆上的点的坐标为θ。圆的参数方程为您提供:

  

x = r cos θ

     

y = r sin θ

这些方程中的角度θ是以逆时针方向从正x轴以弧度测量的。如果您的角度以度为单位,您会发现πM_PI常量有用:

  

360度= 2 π弧度

其余的是简单的数学运算,取你的旋转角度给你A的角度(记住调整0为x轴,如果需要则逆时针测量),其他中心是72度的倍数( 0.4 π弧度)。

HTH

答案 1 :(得分:0)

我不确定我是否完全理解您的问题,但如果您只需要知道一个已知点并将其旋转一定度数,请查看CGAffineTransform的文档。

例如:

CGAffineTransform rotation = CGAffineTransformMakeRotation (angle);
CGPoint rotatedPoint = CGPointApplyAffineTransform (startingPoint, rotation);

此旋转矩阵在(0,0)左右,角度以弧度为单位,因此您需要减去超视图边界的中心以获得相对于中心的偏移,进行旋转,以及加回到中心。或者,您可以构建由平移,旋转和反向平移组成的仿射变换,然后将其应用于上述起点。

答案 2 :(得分:0)

鉴于您似乎已经知道主旋转角度,这将为您提供-180 ... +80范围内的角度以及每个白色圆盘的位置:

GCFloat toRads = M_PI / 180.0;

CGFloat angleA = self.rotationInDegrees;
if (angleA > 180) angleA -= 360;
CGFloat xA = self.radius * sinf(angleA * toRads);
CGFloat yA = self.radius * cosf(angleA * toRads);

CGFloat angleB = angleA + 72;
if (angleB > 180) angleB -= 360;
CGFloat xB = self.radius * sinf(angleB * toRads);
CGFloat yB = self.radius * cosf(angleB * toRads);

etc...

(这假设您的零度是垂直的。如果它来自水平交换cos并且罪过了)。