Pregunta

Tengo un conjunto de llamadas Java2D que dibujan los vectores en un contexto gráfico. Me gustaría que la imagen que se duplicó en tamaño y luego se gira 90 grados.

Estoy usando el siguiente código para hacer esto:

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

Esta gira y escalas, sin embargo, la escala no se aplica de la manera que me gustaría. Es como si se gira antes de escalar, por lo tanto haciendo que la imagen más ancha en el eje equivocado.

¿Hay una mejor manera de hacer esto?

¿Fue útil?

Solución

Creo que esas transformaciones se implementan como una pila - por lo transformo la última se lleva a cabo en primer lugar. Intenta invertir el orden de las transformaciones rotar y escalar y usted debe conseguir lo que busca.

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

Otros consejos

Las rotaciones se realizan siempre sobre el origen. Con el fin de girar alrededor de un punto determinado debe traducir el puntos.

Esta página explica las matemáticas detrás de lo que está intentando hacer y muestran por qué transformaciones se deben aplicar en un orden determinado.

Cambiar el orden en que concatena las transformaciones para controlar el orden en el que se aplican en el compuesto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top