Chcę obrócić CGPoint na ekranie w zależności od kąta, a obrót jest zakotwiczony w innym punkcie. Zastanawiałeś się, jaki jest najskuteczniejszy sposób na zrobienie tego?Jaki jest najlepszy sposób obracania punktu CGPoint na siatce?
Odpowiedz
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);
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ą).
Adam, uratowałeś moje życie z wyjaśnieniem koniugacji. Dziękuję :) –
Użyj CGAffineTransform.
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.
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)
Czy to znaczy, że chce coś obracać wokół punktu? – Jasarien
Tak, oczywiście, z punktu początkowego. – Frank