在网格上旋转CGPoint的最佳方法是什么?

时间:2009-10-20 15:02:25

标签: iphone math rotation

我想根据角度在屏幕上旋转CGPoint,旋转锚定在另一个点上。想知道最有效的方法是什么?

6 个答案:

答案 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)