Frage

Ich habe eine Reihe von Java2D Anrufe bekam, die Vektoren auf einem Grafikkontext zeichnen. Ich möchte mich für das Bild in der Größe verdoppelt werden und dann gedreht, um 90 Grad.

Ich verwende den folgenden Code, dies zu tun:

Graphics2D g2 = // ... get graphics 2d somehow ...
AffineTransform oldTransform = g2.getTransform();
AffineTransform newTransform = (AffineTransform)oldTransform.clone();
newTransform.concatenate(AffineTransform.getTranslateInstance(x1, x2));
newTransform.concatenate(AffineTransform.getScaleInstance((double)newW/(double)iconW, (double)newH/(double)iconH));
newTransform.concatenate(AffineTransform.getRotateInstance(Math.toRadians(rotationAngle), (double)iconW/2.0d, (double)iconH/2.0d));
// ... do my drawing ...

Dies dreht und Skalen, jedoch ist die Skala nicht die Art und Weise angewendet ich möchte. Es ist, als wenn er gedreht wird vor der Skalierung, wodurch das Bild breiter auf der falschen Achse.

Gibt es einen besseren Weg, dies zu tun?

War es hilfreich?

Lösung

Ich glaube, diese Transformationen wie ein Stapel implementiert sind - so verwandeln die letzte zuerst durchgeführt wird. Versuchen Sie die Umkehrung der Reihenfolge der Rotations- und Skalierungstransformationen und Sie sollten bekommen, was Sie suchen.

newTransform.concatenate(AffineTransform.getTranslateInstance(x1, x2));
newTransform.concatenate(AffineTransform.getRotateInstance(Math.toRadians(rotationAngle), (double)iconW/2.0d, (double)iconH/2.0d));
newTransform.concatenate(AffineTransform.getScaleInstance((double)newW/(double)iconW, (double)newH/(double)iconH));

Andere Tipps

Rotationen werden immer über den Ursprung durchgeführt. Um drehen sich um einen bestimmten Punkt das übersetzen müssen Punkte.

Diese Seite die Mathematik hinter erklärt, was Sie versuchen, zu tun und zeigt, warum Transformationen in einer bestimmten Reihenfolge angewandt werden müssen.

Ändern Sie die Reihenfolge, in der die Transformationen verketten zur Steuerung der Reihenfolge, in der sie in dem Verbund angewendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top