Domanda

Ho una serie di chiamate Java2D che disegnano vettori su un contesto grafico. Mi piacerebbe per l'immagine da raddoppiata e poi ruotato di 90 gradi.

Sto utilizzando il seguente codice per fare questo:

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

Questa ruota e scale, tuttavia, la scala non viene applicato il modo desidero. E 'come se è ruotato prima di scalare, rendendo l'immagine più larga sull'asse sbagliata.

C'è un modo migliore per fare questo?

È stato utile?

Soluzione

Credo che queste trasformazioni sono implementate come una pila - così l'ultimo trasformo viene eseguita prima. Provare a invertire l'ordine dei ruotare e ridimensionare le trasformazioni e si dovrebbe ottenere ciò che si sta cercando.

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

Altri suggerimenti

Le rotazioni vengono sempre eseguite circa l'origine. Al fine di ruotare intorno ad un certo punto è necessario tradurre il punti.

Questa pagina spiega la matematica dietro ciò che si sta cercando da fare e mostrare il motivo per cui le trasformazioni devono essere applicate in un certo ordine.

Modificare l'ordine in cui si concatenare le trasformazioni per controllare l'ordine in cui vengono applicati nel composito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top