如何在网格上旋转CGPoint点最佳方法?

12

我想根据角度旋转屏幕上的CGPoint,并且旋转是以另一点为锚点进行的。不知道最有效的方法是什么?


你的意思是想围绕一个点旋转某个东西吗? - Jasarien
是的,显然是从起点开始的。 - Frank
6个回答

24

你也可以使用这个:

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);

我刚刚对那段代码做了一些更改,CGAffineTransformMakeTransation应该是CGAffineTransformMakeTranslation,只是一个小笔误。至于角度,必须是弧度,但除此之外这个代码可以正常工作,谢谢! - Frank

13

使用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);
}

如果你想绕一个不同于原点的点旋转,你需要先从你的点中减去旋转中心,使用上述方法进行旋转,然后再将旋转中心加回来(在矩阵理论中称之为共轭)。


Adam,你的关于词形变化的解释拯救了我的一生。谢谢 :) - Felipe Cypriano

4

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))
    }
}

1

你也可以让核心动画来完成它。查看苹果关于图层几何和变换的文档,了解核心动画编程指南

你所要做的就是设置图层的anchorPoint,然后可以使用类似以下的代码应用变换:

CABasicAnimation *rotationAnimation;
rotationAnimation = [CABasicAnimation 
                     animationWithKeyPath:@"transform.rotation.z"];

[rotationAnimation setFromValue:DegreesToNumber(0)];
[rotationAnimation setToValue:DegreesToNumber(360)];

DegreesToNumber将角度转换为弧度并返回NSNumber表示。

我不确定您究竟要做什么,但通常核心动画是可视化的绝佳选择。


1

0

使用 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接