2013-10-10 15 views
7

ich folgendes gelesen habe, von One step affine transform for rotation around a point?:Wie kann ich ein Bild zuverlässig um einen Punkt drehen?

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

Allerdings, wenn ich tun dies die transformierten Bilder über die ganze Karte sind, und nur selten über den Bildschirm.

Ich habe ein bisschen versucht, ein System zu machen, wo es Bilder setzt; Wenn Sie eine Schleife ausführen und mehrere Werte platzieren, wird eine Spirale angezeigt. Während ich vielleicht in der Lage sein würde, die Beziehung zwischen einer Rotation von Bildern und den Punkten, über die ich sie drehen wollte, zu lösen, wollte ich nach der besten Lösung fragen: "Ich habe hier ein Bild; Ich möchte, dass es um diesen Betrag herum gedreht wird, aber nicht anders. "

Ich versuche einen modifizierten Port von http://JonathansCorner.com/ancient-clock/ zu machen, und im Moment versuche ich den Stundenzeiger zu platzieren. Alle Versuche, das Lied und den Tanz oben zu machen und es so zu übersetzen, dass sein Zentrum in der gewünschten Mitte ist, sind gescheitert.

Wie, für die Hände dieser Uhr, kann ich sagen "Ich möchte die Hände in den folgenden Rotationen" und haben sie angemessen um das Zentrum gelegt?

--EDIT--

Der entscheidende Teil dieses Codes in einem Versuch, bearbeitet Schichten auf einen Kommentar in Reaktion zu verwenden, ist:

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]; 

Danke,

- EDIT--

Ich habe jetzt etwas reduziert; wenn ich einige der Anweisungen folgen, die ich habe:

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; 

ich immer diese Zahlen aus arbeiten möchte, aber dies hat eine Stunde von 9.00 Uhr richtig angezeigt.

Vielen Dank für Ihre Hilfe!

+0

Haben Sie ein paar Beispielbilder Sie Beiträge verfassen können? Was nennst du als 'x' und' y' hier? Sie sollten die Hälfte der Breite bzw. Höhe des Begrenzungsrechtecks ​​der Sache sein, die Sie zu drehen versuchen. –

+0

Auch was ist 'a'? Beachten Sie, dass es in Radianten, nicht Grad ausgedrückt werden muss. –

+0

Alle geometrischen Manipulationen zur Ansicht finden um den Ankerpunkt statt. Beispiel: Wenn ankerPoint = {0.5.0.5} (Mitte), rotiert die Ansicht so, als ob es eine z-Achse quer durch das Zentrum gäbe. Clock Hände rotiert fast um die Spitze herum, also brauchen Sie etwas wie hourHand.layer.anchorPoint = CGPointMake (0.5f, 0.9f); – Jano

Antwort

6

Diese Zeile:

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y); 

verschiebt das Bild von x, y.

diese Linie (HINWEIS-- Sie rund um den Kontrollpunkt drehen wird, was auch immer Sie haben, dass sein eingestellt):

transform = CGAffineTransformRotate(transform, a); 

dreht es sich um den Kontrollpunkt.

Wenn sich Ihr Kontrollpunkt in der oberen linken Ecke befindet (Standardeinstellung), wird er um die obere linke Ecke gedreht.

Sie müssen diese Einstellung vornehmen:

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

es um die Mitte der Schicht zu spinnen zu bekommen.

+1

Es scheint, dass Sie auch nicht verstanden haben, wie Trabformen funktionieren: Die Makrotranslation erzeugt eine Transmatrix, die alle Punkte um + x, + y verschiebt; Das Roatate führt eine Verkettung der vorhandenen Transformationsmatrix durch und fügt eine Rotationsmatrix um (0,0) hinzu. Wenn Sie den Ankerpunkt setzen, dann macht ios im Falle von Rotationen zwei Trandformatinematrizen für Sie: Zuerst transfe- rieren Sie den Anker nach (0,0), tun Sie Ihre Rotation und übersetzen Sie dann zurück. – AlexWien

9

Eine Drehung wird immer um (0,0) gemacht.

Um einen Punkt zu übersetzen, müssen Sie zuerst den Rotationspunkt in (0,0) übersetzen und dann drehen und dann zurück übersetzen.

So sollte es sein:

// 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

Eine Rotation ist immer in der Nähe gemacht (0,0).

Um einen Punkt zu übersetzen, müssen Sie zuerst den Rotationspunkt auf (0,0) übersetzen und dann drehen und dann zurück übersetzen.

So sollte es sein:

// 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 
Verwandte Themen