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:
- getRotateInstance
- getScaleInstance
- getShearInstance
- getTranslateInstance
De forma alternativa podemos 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 resultante se concatena con la
transformación actual y es aplicada durante el dibujado.
- rotate--para especificar un ángulo de rotación en radianes.
- scale--para especificar un factor de escala en direcciones
x e y.
- shear--para especificar un factor de compartición en
direcciones x e
y
- translate--para especificar un desplazamiento de movimiento en
direcciones x e
y
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 aplicado 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.
Esta es una imagen del GUI del applet. Para ajecutar el applet, 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 se concatena 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);