2013-10-10 12 views
7

Czytałem następujące, z One step affine transform for rotation around a point?:Jak mogę niezawodnie obracać obraz wokół punktu?

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y); 
transform = CGAffineTransformRotate(transform, a); 
transform = CGAffineTransformTranslate(transform,-x,-y); 

Jednak, gdy robię to obrazy przekształcane są na całej mapie, a rzadko na ekranie.

Próbowałem trochę zrobić system, w którym będzie umieszczać obrazy; jeśli uruchomisz pętlę i wstawisz kilka wartości, pojawi się spirala. Jednakże, chociaż może uda mi się ostatecznie rozplątać związek między rotacją obrazów a punktami, które chciałem, aby się obracały, chciałem poprosić o najlepsze rozwiązanie: "Mam tu obraz, uważam, że ten punkt jest jego centrum, chcę, żeby była obrócona o tę kwotę wokół jej centrum, ale w żaden inny sposób nie mogłaby zostać przesunięta. "

Próbuję zmodyfikować port http://JonathansCorner.com/ancient-clock/, a teraz próbuję umieścić wskazówkę godzinową. Wszystkie próby wykonania piosenki i tańca powyżej i przetłumaczenia jej tak, aby jej centrum znajdowało się w pożądanym centrum, zawiodły.

W jaki sposób, dla rąk tego zegara, mogę powiedzieć "Chcę rąk w następujących obrotach" i czy są one odpowiednio umieszczone wokół środka?

--EDIT--

Zasadniczą część tego kodu, pod redakcją próbując wykorzystać warstwy w odpowiedzi na komentarz, to:

UIImage *hourHandImage = [UIImage imageNamed:@"hour-hand.png"]; 
UIImageView *hourHandView = [[UIImageView alloc] initWithImage:hourHandImage]; 
float hourRotation = .5; 
hourHandImage = [UIImage imageNamed:@"hour-hand.png"]; 
hourHandView = [[UIImageView alloc] initWithImage:hourHandImage]; 
CGAffineTransform transform = CGAffineTransformMakeTranslation(centerX - 21, -centerY - 121); 
// transform = CGAffineTransformRotate(transform, hourRotation); 
// transform = CGAffineTransformTranslate(transform, 2 * centerX, 2 * centerY); 
hourHandView.transform = transform; 
hourHandView.layer.anchorPoint = CGPointMake(centerX, centerY); 
hourHandView.layer.affineTransform = CGAffineTransformRotate(transform, hourRotation); 
[self.view addSubview:hourHandView]; 

Dzięki,

- EDYTUJ:

Mam teraz coś zredukowanego; jeśli śledzę niektóre z instrukcją, mam:

CGAffineTransform transform = CGAffineTransformMakeTranslation(100 -21, 100 -121); 
transform = CGAffineTransformRotate(transform, hour/12.0 * M_PI * 2.0); 
transform = CGAffineTransformTranslate(transform, -330, 330); 
hourHandView.transform = transform; 

Chciałbym pracować na uzyskanie tych numerów na zewnątrz, ale nie ma to godzina 9:00 poprawnie wyświetlany.

Dzięki za pomoc!

+0

Czy masz kilka przykładowych zdjęć można zamieścić? Co używasz tutaj jako "x" i "y"? Powinny być równe połowie szerokości i wysokości prostokąta obwiedni przedmiotu, który próbujesz obrócić. –

+0

Co to jest "a"? Zauważ, że musi być wyrażony w radianach, a nie w stopniach. –

+0

Wszystkie geometryczne manipulacje do widoku występują wokół punktu kontrolnego. Przykład, jeśli anchorPoint = {0.5,0.5} (w środku), widok obraca się tak, jakby znajdowała się oś Z prosto przez środek. Ręce zegara obracają się prawie wokół końcówki, więc potrzebujesz czegoś takiego jak hourHand.layer.anchorPoint = CGPointMake (0.5f, 0.9f); – Jano

Odpowiedz

6

Linia:

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y); 

przenosi obraz przez x, y.

(Note-- będzie kręcić się wokół punktu kontrolnego, co masz ustawione, że być)

ta linia:

transform = CGAffineTransformRotate(transform, a); 

obraca się wokół punktu kontrolnego.

Jeśli twój punkt kontrolny znajduje się w lewym górnym rogu (ustawienie domyślne), obraca się wokół górnego lewego rogu.

trzeba ustawić to:

[self layer].anchorPoint = CGPointMake(0.5, 0.5); 

aby dostać się kręcić wokół środka warstwy.

+1

Wygląda na to, że nie zrozumiałeś również, jak działają trabsformacje: Mak etranslation tworzy macierz trans, która przesuwa wszystkie punkty o + x, + y; Roatat powoduje połączenie istniejącej macierzy przekształceń i dodaje macierz rotacji wokół (0,0). Jeśli ustawisz punkt kontrolny, to ios w przypadku rotacji stworzy dla ciebie dwie macierze trandformatynowe: najpierw trans kotwicę do (0,0), a następnie swoje tłumaczenie, a następnie przetłumacz z powrotem. – AlexWien

9

Rotacja zawsze odbywa się w pobliżu (0,0).

Aby przetłumaczyć wokół punktu PIERWSZA potrzeba tłumaczenia punktu obrotu na (0,0) , a następnie obróć go, a następnie przetłumacz z powrotem.

Tak powinno być:

// cx, cy is center of screen 
// move (cx,cy) to (0,0) 
CGAffineTransform transform = CGAffineTransformMakeTranslation(-cx, -cy); 

// roate around (0,0) 
transform = CGAffineTransformRotate(transform, angleRadians); 

// mov e (0,0) back to (cx,cy) 
transform = CGAffineTransformTranslate(transform,cx,cy); 
7
hourImageView.layer.anchorPoint = CGPointMake(0.5f, 0.9f); 
CGFloat angle = hour/12.0 * M_PI * 2.0; 
hourHand.transform = CGAffineTransformMakeRotation(angle); 
0

Swift 4.0

Obrót odbywa się zawsze około (0,0).

Aby przetłumaczyć wokół punktu trzeba najpierw przetłumaczyć obracania wskaż polecenie (0,0), a następnie obróć go, a następnie przełożyć je do tyłu.

Tak powinno być:

// centerX, centerY is center of screen 
// move (centerX,centerY) to (0,0) 
var myTransform = CGAffineTransform(translationX: -centerX, y: -centerY) 

// rotate around (0,0) 
myTransform = myTransform.concatenating(CGAffineTransform(rotationAngle: angleInRadians)) 

// move (0,0) back to (cx,cy) 
myTransform = myTransform.concatenating(CGAffineTransform(translationX: centerX, y: centerY)) 

myView.transform = myTransform 
Powiązane problemy