2009-10-20 15 views

Respuesta

24

También puede utilizar lo siguiente:

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

EDIT: para llevar a cabo la rotación alrededor del punto a medida que usted debe hacer como Adán describió en su respuesta. Usando CGAffineTransform debe verse algo así como:

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

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

rotatedPoint = CGPointApplyAffineTransform(initialPoint, customRotation); 
+0

¿maneja esto la rotación en otro punto aparte sobre sí mismo? – Frank

+0

acabamos de hacer algunos cambios en ese código, CGAffineTransformMakeTransation es CGAffineTransformMakeTranslation, error menor. y para ángulo, tiene que ser radiante pero aparte de eso, ¡esto funciona! – Frank

10

Utilice un 2D rotation matrix. Si desea girar un punto en sentido antihorario alrededor del origen en un ángulo de angle, entonces usted podría hacer esto:

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 desea girar alrededor de un punto que no sea el origen, que tendrá que restar primero el centro de rotación de su punto, rótelo usando lo anterior, y luego vuelva a agregarlo en el centro de rotación (esto se llama conjugación en la teoría de la matriz).

+0

Adam, salvaste mi vida con la explicación sobre la conjugación. Gracias :) –

1

También puede dejar que Core Animation lo haga por usted. Echar un vistazo a documentos de Apple sobre la geometría de capa y se transforma en el Core Animation Programming Guide

Todo lo que tiene que hacer es configurar el Anchorpoint de la capa y luego se puede aplicar la transformación con algo como esto:

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

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

DegreesToNumber convierte grados a radianes y devuelve una representación NSNumber.

No estoy seguro de lo que está intentando hacer exactamente, pero a menudo Core Animation es una gran opción para las visualizaciones.

0

Usando Vladimir’s answer, a continuación es la Swift 3 respuesta:

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) 
Cuestiones relacionadas