2009-10-20 4 views

Antwort

24

Sie können auch das verwenden:

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

EDIT: Rotation um benutzerdefinierten Punkt auszuführen, müssen Sie tun, wie Adam in seiner Antwort beschrieben. Mit CGAffineTransform muss es in etwa so aussehen:

+0

behandelt diese Drehung an einem anderen Punkt auf sich selbst? – Frank

+0

hat nur ein paar Änderungen an diesem Code vorgenommen, CGAffineTransformMakeTransation ist CGAffineTransformMakeTranslation, kleiner Tippfehler. und für den Winkel muss es Radiant sein, aber anders als das funktioniert thx! – Frank

10

Verwenden Sie eine 2D rotation matrix. Wenn Sie einen Punkt gegen den Uhrzeigersinn um den Ursprung um einen Winkel von angle drehen möchten, dann würden Sie dies tun:

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

Wenn Sie zu einem anderen Punkt als den Ursprung drehen wollen, müssen Sie zuerst subtrahieren haben das Rotationszentrum von Ihrem Punkt, drehen Sie es mit der oben genannten, und fügen Sie dann zurück in der Mitte der Rotation (das heißt Konjugation in Matrix-Theorie).

+0

Adam, du hast mein Leben mit der Erklärung der Konjugation gerettet. Danke :) –

1

Sie können Core Animation auch für Sie tun lassen. Werfen Sie einen Blick auf Apples docs auf Schichtgeometrie und wandelt in der Core Animation Programming Guide

Alles was Sie tun müssen, ist die anchor der Schicht eingestellt und dann können Sie die Transformation mit so etwas wie dies gilt:

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

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

DegreesToNumber wandelt Grad in Radiant um und gibt eine NSNumber-Darstellung zurück.

Ich bin mir nicht sicher, was Sie genau machen wollen, aber Core Animation ist oft eine gute Wahl für Visualisierungen.

0

Mit Vladimir’s answer, unten ist die Swift 3 Antwort:

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) 
Verwandte Themen