我想根据角度在屏幕上旋转CGPoint,旋转锚定在另一个点上。想知道最有效的方法是什么?
答案 0 :(得分:24)
您也可以使用:
rotatedPoint = CGPointApplyAffineTransform(initialPoint, CGAffineTransformMakeRotation(angle));
编辑:要围绕自定义点进行旋转,你必须像他在答案中描述的那样做。使用CGAffineTransform它必须看起来像:
CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(customCenter.x, customCenter.y);
CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(angle);
CGAffineTransform customRotation = CGAffineTransformConcat(CGAffineTransformConcat( CGAffineTransformInvert(translateTransform), rotationTransform), translateTransform);
rotatedPoint = CGPointApplyAffineTransform(initialPoint, customRotation);
答案 1 :(得分:10)
使用2D rotation matrix。如果你想以angle
的角度逆着原点逆时针旋转一个点,那么你会这样做:
CGPoint RotatePointAboutOrigin(CGPoint point, float angle)
{
float s = sinf(angle);
float c = cosf(angle);
return CGPointMake(c * point.x - s * point.y, s * point.x + c * point.y);
}
如果要围绕原点以外的点旋转,则必须先从点中减去旋转中心,使用上面的旋转,然后在旋转中心加回(这称为矩阵理论中的共轭。
答案 2 :(得分:2)
快捷键5
extension CGPoint {
func rotate(around center: CGPoint, angle: CGFloat) -> CGPoint {
let translate = CGAffineTransform(translationX: -center.x, y: -center.y)
let transform = translate.concatenating(CGAffineTransform(rotationAngle: angle))
let rotated = applying(transform)
return rotated.applying(CGAffineTransform(translationX: center.x, y: center.y))
}
}
答案 3 :(得分:1)
答案 4 :(得分:1)
您也可以让Core Animation为您完成。在Core Animation Programming Guide
中查看Apple关于图层几何和变换的文档您所要做的就是设置图层的anchorPoint,然后您可以使用以下内容应用转换:
CABasicAnimation *rotationAnimation;
rotationAnimation = [CABasicAnimation
animationWithKeyPath:@"transform.rotation.z"];
[rotationAnimation setFromValue:DegreesToNumber(0)];
[rotationAnimation setToValue:DegreesToNumber(360)];
DegreesToNumber将度数转换为弧度并返回NSNumber表示。
我不确定你想要做什么,但核心动画通常是可视化的绝佳选择。
答案 5 :(得分:0)
使用Vladimir’s answer,下面是 Swift 3 答案:
let initialPoint = CGPoint(x: 100, y: 100) // the point you want to rotate
let translateTransform = CGAffineTransform(translationX: initialPoint.x, y: initialPoint.y)
let rotationTransform = CGAffineTransform(rotationAngle: angle)
let customRotation = (rotationTransform.concatenating(translateTransform.inverted())).concatenating(translateTransform)
rotatedPoint = initialPoint.applying(customRotation)