获取superview旋转后的实际角度
Get the actual angle after the superview is rotated
我有 5 个子视图(白色)添加到超级视图(灰色),当我旋转超级视图时我想知道每个带有红色圆圈的子视图的角度(如 1 和 2)。(中心子视图和红色圆圈在同一个圆圈上)
起始位置:
旋转位置:
根据您的评论,您似乎想要确定给定旋转的五个圆心的坐标。中心将全部位于一个圆圈上。所以你的问题归结为半径为 r 的圆上的一个点的坐标是什么,角度为 θ。圆的参数方程为您提供:
x = r cos θ
y = r sin θ
角度 θ 在这些方程式中以 弧度 为单位从正 x 轴沿逆时针方向测量。如果您的角度以度为单位,您会发现 π 的 M_PI
常量有用为:
360 degrees = 2 π radians
剩下的就是简单的数学运算,把你的旋转角度给你A的角度(记得调整0为x轴,如果需要逆时针测量),其他中心是72的倍数度数(0.4 π 弧度)。
HTH
我不确定我是否完全理解你的问题,但如果你只需要取一个已知点并将其旋转一定度数,请查看 CGAffineTransform.[=12= 的文档]
例如:
CGAffineTransform rotation = CGAffineTransformMakeRotation (angle);
CGPoint rotatedPoint = CGPointApplyAffineTransform (startingPoint, rotation);
这个旋转矩阵围绕 (0, 0) 并且角度以弧度为单位,因此您需要减去父视图边界的中心以获得相对于中心的偏移量,进行旋转,然后加回去在中心。或者,您可以构建一个由该平移、旋转和逆平移组成的仿射变换,然后将其应用于上述起点。
鉴于您似乎已经知道主旋转角度,这将为您提供 -180 .. +180 范围内的角度和每个白色圆盘的位置:
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 和 sin)。
我有 5 个子视图(白色)添加到超级视图(灰色),当我旋转超级视图时我想知道每个带有红色圆圈的子视图的角度(如 1 和 2)。(中心子视图和红色圆圈在同一个圆圈上)
起始位置:
旋转位置:
根据您的评论,您似乎想要确定给定旋转的五个圆心的坐标。中心将全部位于一个圆圈上。所以你的问题归结为半径为 r 的圆上的一个点的坐标是什么,角度为 θ。圆的参数方程为您提供:
x = r cos θ
y = r sin θ
角度 θ 在这些方程式中以 弧度 为单位从正 x 轴沿逆时针方向测量。如果您的角度以度为单位,您会发现 π 的 M_PI
常量有用为:
360 degrees = 2 π radians
剩下的就是简单的数学运算,把你的旋转角度给你A的角度(记得调整0为x轴,如果需要逆时针测量),其他中心是72的倍数度数(0.4 π 弧度)。
HTH
我不确定我是否完全理解你的问题,但如果你只需要取一个已知点并将其旋转一定度数,请查看 CGAffineTransform.[=12= 的文档]
例如:
CGAffineTransform rotation = CGAffineTransformMakeRotation (angle);
CGPoint rotatedPoint = CGPointApplyAffineTransform (startingPoint, rotation);
这个旋转矩阵围绕 (0, 0) 并且角度以弧度为单位,因此您需要减去父视图边界的中心以获得相对于中心的偏移量,进行旋转,然后加回去在中心。或者,您可以构建一个由该平移、旋转和逆平移组成的仿射变换,然后将其应用于上述起点。
鉴于您似乎已经知道主旋转角度,这将为您提供 -180 .. +180 范围内的角度和每个白色圆盘的位置:
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 和 sin)。