2009-10-20 4 views

Répondre

24

Vous pouvez également l'utiliser:

rotatedPoint = CGPointApplyAffineTransform(initialPoint, CGAffineTransformMakeRotation(angle)); 

EDIT: pour effectuer une rotation autour du point personnalisé, vous devez faire comme Adam décrit dans sa réponse. En utilisant CGAffineTransform, il doit ressembler à quelque chose comme:

CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(customCenter.x, customCenter.y); 
CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(angle); 

CGAffineTransform customRotation = CGAffineTransformConcat(CGAffineTransformConcat(CGAffineTransformInvert(translateTransform), rotationTransform), translateTransform); 

rotatedPoint = CGPointApplyAffineTransform(initialPoint, customRotation); 
+0

cela gère-t-il la rotation sur un autre point de côté sur lui-même? – Frank

+0

vient de faire quelques changements sur ce code, CGAffineTransformMakeTransation est CGAffineTransformMakeTranslation, faute de frappe mineure. et pour l'angle, il faut que ce soit radian mais à part ça cela fonctionne thx! – Frank

10

Utilisez un 2D rotation matrix. Si vous souhaitez faire pivoter un point antihoraire sur l'origine d'un angle de angle, alors vous feriez ceci:

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

Si vous voulez tourner autour d'un point autre que l'origine, vous devez d'abord Soustraire le centre de rotation à partir de votre point, faites-le pivoter en utilisant ce qui précède, puis rajoutez au centre de rotation (c'est ce qu'on appelle la conjugaison en théorie des matrices).

+0

Adam, Tu m'as sauvé la vie avec l'explication de la conjugaison. Merci :) –

1

Vous pouvez également laisser Core Animation le faire pour vous. Jetez un coup d'oeil aux documents d'Apple sur la géométrie de la couche et se transforme dans le Core Animation Programming Guide

Tout ce que vous devez faire est de régler la Anchorpoint de la couche et vous pouvez appliquer la transformation avec quelque chose comme ceci:

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

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

DegreesToNumber convertit les degrés en radians et renvoie une représentation NSNumber.

Je ne suis pas sûr de ce que vous essayez de faire exactement, mais souvent Core Animation est un excellent choix pour les visualisations.

0

En utilisant Vladimir’s answer, ci-dessous est le Swift 3 Réponse:

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) 
Questions connexes