我想根据角度旋转屏幕上的CGPoint,并且旋转是以另一点为锚点进行的。不知道最有效的方法是什么?
你也可以使用这个:
rotatedPoint = CGPointApplyAffineTransform(initialPoint, CGAffineTransformMakeRotation(angle));
编辑:要绕自定义点执行旋转,必须像 Adam 在他的答案中描述的那样操作。使用 CGAffineTransform,代码应该类似于:
CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(customCenter.x, customCenter.y);
CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(angle);
CGAffineTransform customRotation = CGAffineTransformConcat(CGAffineTransformConcat( CGAffineTransformInvert(translateTransform), rotationTransform), translateTransform);
rotatedPoint = CGPointApplyAffineTransform(initialPoint, customRotation);
使用2D旋转矩阵。 如果您想将点逆时针旋转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);
}
如果你想绕一个不同于原点的点旋转,你需要先从你的点中减去旋转中心,使用上述方法进行旋转,然后再将旋转中心加回来(在矩阵理论中称之为共轭)。
Swift 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))
}
}
你也可以让核心动画来完成它。查看苹果关于图层几何和变换的文档,了解核心动画编程指南。
你所要做的就是设置图层的anchorPoint,然后可以使用类似以下的代码应用变换:
CABasicAnimation *rotationAnimation;
rotationAnimation = [CABasicAnimation
animationWithKeyPath:@"transform.rotation.z"];
[rotationAnimation setFromValue:DegreesToNumber(0)];
[rotationAnimation setToValue:DegreesToNumber(360)];
DegreesToNumber将角度转换为弧度并返回NSNumber表示。
我不确定您究竟要做什么,但通常核心动画是可视化的绝佳选择。
使用 Vladimir的答案,以下是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)