2009-03-25 6 views
3

Ich habe eine Reihe von Java2D-Aufrufe, die Vektoren auf einen Grafikkontext zeichnen. Ich möchte, dass das Bild in der Größe verdoppelt und dann um 90 Grad gedreht wird.Rotation und Skalierung - Wie man beides macht und das richtige Ergebnis erzielt?

ich den folgenden Code bin mit, 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 mag würde. Es ist so, als ob es vor dem Skalieren gedreht wird, wodurch das Bild auf der falschen Achse breiter wird.

Gibt es einen besseren Weg, dies zu tun?

Antwort

3

Ich glaube, dass diese Transformationen wie ein Stapel implementiert sind - also wird die letzte Transformation zuerst durchgeführt. Versuchen Sie, die Reihenfolge der Rotations- und Skalierungstransformationen umzukehren, und Sie sollten erhalten, 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)); 
+0

Ok, das funktioniert, aber ich verstehe es nicht. Warum ist es in Ordnung, die Übersetzung zuerst anzuwenden? Dh, wenn Übersetzen zuerst passiert, passiert es zuerst. Aber dreht sich nach der Skalierung, auch wenn die Rotation zuerst angewendet wird? Da ist etwas, das ich nicht verstehe. – jsight

+0

Schwer zu erklären, warum die Übersetzung immer noch korrekt funktioniert, aber wenn Sie sich die zugrunde liegende Matrix-Mathematik ansehen, werden Sie sehen, warum sie sinnvoll ist. –

1

Ändern Sie die Reihenfolge, in der Sie die Transformationen verketten, um die Reihenfolge zu steuern, in der sie im Verbund angewendet werden.

2

Rotationen werden immer über den Ursprung durchgeführt. Um die rotate about a certain point müssen Sie die Punkte übersetzen.

This page erläutert die mathematischen Methoden, die Sie verfolgen, und zeigt, warum Transformationen in einer bestimmten Reihenfolge angewendet werden müssen.

+0

Das zweite und das dritte Argument von getRotateInstance verwalten die Umwandlung. Das war nicht das gleiche Problem. – jsight

Verwandte Themen