2009-10-20 6 views

Odpowiedz

24

Można również użyć tego:

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

EDIT: wykonać obrót wokół punktu niestandardowego trzeba zrobić jak Adam opisał w swojej odpowiedzi. Korzystanie z CGAffineTransform musi wyglądać tak:

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

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

rotatedPoint = CGPointApplyAffineTransform(initialPoint, customRotation); 
+0

czy ten uchwyt obraca się w innym punkcie na bok? – Frank

+0

właśnie wprowadził kilka zmian w tym kodzie, CGAffineTransformMakeTransation to CGAffineTransformMakeTranslation, pomniejsza literówka. i pod kątem, to musi być radian, ale inne niż to działa thx! – Frank

10

Użyj numeru 2D rotation matrix. Jeśli chcesz obrócić punkt lewo o pochodzeniu o kąt angle, wtedy byłoby to zrobić:

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

Jeśli chcesz obrócić wokół punktu innego niż pochodzenie, będziesz musiał najpierw odjąć środek obrotu od punktu, obróć go za pomocą powyższego, a następnie dodaj ponownie w środku obrotu (w teorii macierzy nazywa się to koniugacją).

+0

Adam, uratowałeś moje życie z wyjaśnieniem koniugacji. Dziękuję :) –

1

Możesz także pozwolić Core Animation zrobić to za Ciebie. Spójrz na docs Apple na geometrii warstwy i przekształca w Core Animation Programming Guide

Wszystko co musisz zrobić, to ustawić Anchorpoint warstwy, a następnie można zastosować transformację z mniej więcej tak:

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

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

DegreesToNumber konwertuje stopnie na radiany i zwraca reprezentację NSNumber.

Nie jestem pewien, co dokładnie robisz, ale często Core Animation jest doskonałym wyborem do wizualizacji.

0

Korzystanie Vladimir’s answer, poniżej jest Swift 3 odpowiedź:

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)