2009-10-20 7 views

risposta

24

È inoltre possibile utilizzare che:

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

EDIT: per effettuare la rotazione attorno al punto personalizzato che si deve fare come Adamo ha descritto nella sua risposta. Utilizzando CGAffineTransform deve essere simile:

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

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

rotatedPoint = CGPointApplyAffineTransform(initialPoint, customRotation); 
+0

questo gestisce la rotazione su un altro punto a parte su se stesso? – Frank

+0

ha appena apportato alcune modifiche a tale codice, CGAffineTransformMakeTransation è CGAffineTransformMakeTranslation, errore di battitura minore. e per l'angolo, deve essere radiante ma a parte questo funziona! – Frank

10

Utilizzare un 2D rotation matrix. Se si desidera ruotare in senso antiorario un punto circa l'origine di un angolo di angle, allora si dovrebbe fare questo:

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

Se si desidera ruotare attorno ad un punto diverso da quello di origine, si dovrà prima sottrarre il centro di rotazione dal tuo punto, ruotalo usando il precedente, e quindi aggiungi di nuovo nel centro di rotazione (questo è chiamato coniugazione nella teoria delle matrici).

+0

Adam, mi hai salvato la vita con la spiegazione della coniugazione. Grazie :) –

1

Si può anche lasciare Core Animation farlo per voi. Date un'occhiata a documenti di Apple sulla geometria strato e trasforma nel Core Animation Programming Guide

Tutto quello che dovete fare è impostare l'AnchorPoint dello strato e quindi è possibile applicare la trasformazione con qualcosa di simile:

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

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

DegreesToNumber converte gradi in radianti e restituisce una rappresentazione NSNumber.

Non sono sicuro di cosa si stia tentando di fare esattamente, ma spesso l'Animazione di base è un'ottima scelta per le visualizzazioni.

0

Usando Vladimir’s answer, qui di seguito è il Swift 3 risposta:

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) 
Problemi correlati