Transformar Formas, Texto e Imágenes

Podemos modificar el atributo transform en el contexto Graphics2D para mover, rotar, escalar y modificar gráficos primitivos mientras son dibujados. El atributo transform está definido por un ejemplar de AffineTransform.

Graphics2D proporciona varios métodos para cambiar el atributo transform. Podemos construir un nuevo AffineTransform y cambiar el atributo transform de Graphics2D llamando al método setTransform.

AffineTransform define los siguientes métodos para hacer más sencilla la construcción de nuevas transformaciones:

De forma alternativa podmeos usar uno de los métodos de transformación de Graphics2D para modificar la transformación actual. Cuando se llama a uno de esos métodos de conveniencia, la transformación resultate se concatena con la transformación actual y es aplicada duranter el dibujado:

También podemos construir directamente un AffineTransform y concatenarlo con la transformación actual llamando al método transform .

El método drawImage también está sobrecargado para permitirnos especificar un AffineTransform que es aplicada a la imagen a dibujar. Especificar un transform cuando se llama a drawImage no afecta al atributo transform de Graphics2D.

Ejemplo: Transform

El siguiente programa es el mismo que StrokeandFill, pero también permite al usuario elegir una transformación para aplicarla al objeto selecciona cuando se dibuje.

Pulsa sobre el appler para ejecutar el applet.
Esta es una imagen del GUI del applet. Para ajecutar el appler, pulsa sobre ella. El applet aparecerá en una nueva ventana del navegador.

Transform.java contiene el código completo de este applet.

Cuando se elige una opción de transformación, se modifica un ejemplar de AffineTransform y es concatenado con una transformación de movimiento que mueve la Shape hacia el centro de la ventana. La transformación resultante se pasa al método setTransform para seleccionar el atributo transform de Graphics2D

switch (Transform.trans.getSelectedIndex()){
case 0 : at.setToIdentity();
	 at.translate(w/2, h/2); break;
case 1 : at.rotate(Math.toRadians(45)); break;
case 2 : at.scale(0.5, 0.5); break;
case 3 : at.shear(0.5, 0.0); break;
...
AffineTransform toCenterAt = new AffineTransform();
toCenterAt.concatenate(at);
toCenterAt.translate(-(r.width/2), -(r.height/2));
g2.setTransform(toCenterAt);

Ozito