2016-04-17 3 views
0

Ich habe mehrere Objekte, die ich zusammen rotieren möchte. Wenn sie bei 0 Grad (nach gerade) sind, sind sie gut, aber wenn sie es nicht sind, sieht es wie folgt aus:Wie kann ich die Rotation mehrerer Bilder in JavaFX synchronisieren? Canvas

Wierdness

ich diesen Code verwende zu drehen:

private void rotate(GraphicsContext gc, double angle, double px, double py) { 
    Rotate r = new Rotate(angle, px, py); 
    gc.setTransform(r.getMxx(), r.getMyx(), r.getMxy(), r.getMyy(), r.getTx(), r.getTy()); 
} 

private void drawRotatedImage(GraphicsContext gc, Image image, double angle, double tlpx, double tlpy) { 
    gc.save(); // saves the current state on stack, including the current transform 
    rotate(gc, angle, tlpx + image.getWidth()/2, tlpy + image.getHeight()/2); 
    gc.drawImage(image, tlpx, tlpy); 
    gc.restore(); // back to original state (before rotation) 
} 

Ich habe eine Reihe von Bildern, die ich benutze und rotiere sie, indem ich drawRotatedImage mit einem einheitlichen Winkel anrufe. Alle Bilder sind 32 x 32. Wie kann ich diese Verschiebung in den Bildern beheben?

+0

Kann das Problem nicht reproduzieren. Der Code dreht die Bilder um ihre jeweiligen Zentren, wenn ich es teste ... – fabian

+0

@fabian Es gibt eine Grad-Variable. Es gibt eine Liste von Bildern, die mit dieser Variablen angezeigt werden sollen. Sie sind alle 32 x 32. Sie haben eine spezifizierte "x" und "y" Koordinate zum Zeichnen. Ich zeichne sie an dieser Koordinate und drehe das Bild. Wie kann ich es so machen, dass sie sich als Ganzes drehen? – theTechnoKid

Antwort

1

Um die Bilder als eine Gruppe zu rotieren, einfach die gleiche Transformation verwenden für alle jene Bilder:

Statt

gc.save(); 
gc.setTransform(new Affine(new Rotate(angle, image1CenterX, image1CenterY))); 
gc.drawImage(image1, image1X, image1Y); 
gc.restore(); 

gc.save(); 
gc.setTransform(new Affine(new Rotate(angle, image2CenterX, image2CenterY))); 
gc.drawImage(image2, image2X, image2Y); 
gc.restore(); 

... 

(das ist, was Sie tun, wenn Sie drawRotatedImage für jeden Anruf Bild)

Verwenden

gc.save(); 
gc.setTransform((new Affine(new Rotate(angle, rotationCenterX, rotationCenterY))); 

gc.drawImage(image1, image1unrotatedX, image1unrotatedY); 
gc.drawImage(image2, image2unrotatedX, image2unrotatedY); 
... 

gc.restore(); 
+0

Was wird 'rotationCenterX' und' rotationCenterY' sein? – theTechnoKid

+0

Es hat funktioniert, danke! Ich habe die Start-X und Y als 'rotationCenterX' und' rotationCenterY' verwendet. Würde das Zentrum besser funktionieren? Oder das Ende? – theTechnoKid

+0

@theTechnoKid U möchte alle Knoten um einen Punkt rotieren. Welchen Punkt Sie benötigen, liegt an Ihnen. Wenn Sie 'P = (x, y)' als Drehpunkt (= Rotationszentrum) verwenden, erhalten Sie den gleichen Effekt Als ob Sie das Objekt, das Sie mit "-P" malen, bewegen, drehen Sie sich um den Ursprung und verschieben Sie das Ergebnis um "P". Entscheiden Sie einfach, welcher Punkt die Position während der Drehung beibehalten soll (vorausgesetzt, dass etwas an dieser Stelle gemalt wurde) Die Pivot-Punkte könnten ein Schnittpunkt der Gitterlinien, der Mittelpunkt eines Gitterfelds sein (die Imgs sind mit den Gitterfeldern nach Rotationen um ein Vielfaches von 90 ° ausgerichtet.) Verwenden Sie im Zweifelsfall die Mitte des Gitters. – fabian

Verwandte Themen