Rotando una imagen a través de java.awt.geom.AffineTransform

Mediante AffineTransform se puede rotar una imagen dibujada sobre un Graphics.
Esto se debe a que en realidad AffineTransform agrega una transformada al objeto Graphipcs.

Para rotar se pasa a una instancia de AffineTransform a través de rotate(), pasándole el ángulo en radianes y el centro de rotación. Luego esta instancia se asigna al objeto Graphics (debemos asignársela a Graphics2D en realidad)

  1. AffineTransform at = new AffineTransform();  
  2. at.rotate(r, 100100); //se asigna el angulo y centro de rotacion  
  3. ((Graphics2D) g).setTransform(at);  

Ejemplo

Por ejemplo creamos un panel que muestra un cuadrado girado una determinada cantidad de grados llamada JPanelImagenGiratoria.java:

  1. import java.awt.Color;  
  2. import java.awt.Graphics;  
  3. import java.awt.Graphics2D;  
  4. import java.awt.geom.AffineTransform;  
  5.   
  6. public class JPanelImagenGiratoria extends javax.swing.JPanel {  
  7.   
  8.     private int grados = 0;  
  9.   
  10.     public int getGrados() {  
  11.         return grados;  
  12.     }  
  13.   
  14.     public void setGrados(int grados) {  
  15.         this.grados = grados;  
  16.         repaint();  
  17.     }  
  18.   
  19.     @Override  
  20.     public void paint(Graphics g) {  
  21.         super.paint(g); //se borra el contenido anterior  
  22.   
  23.         double r = Math.toRadians(grados); //se convierte a radianes lo grados  
  24.   
  25.         AffineTransform at = new AffineTransform();  
  26.         at.rotate(r, 100100); //se asigna el angulo y centro de rotacion  
  27.         ((Graphics2D) g).setTransform(at);  
  28.   
  29.         //se dibuja  
  30.         g.setColor(Color.BLUE);  
  31.         g.drawRect(5050100100);  
  32.   
  33.     }  
  34. }  

y un frame para realizar la prueba del panel llamada PruebaPanel.java. Prestar atención al observador de cambios del JSlider agregado mediante addChangeListener():

  1. import java.awt.BorderLayout;  
  2. import javax.swing.JFrame;  
  3. import javax.swing.JSlider;  
  4.   
  5. public class PruebaPanel{  
  6.   
  7.     public static void main(String[] args) {  
  8.         final JFrame jf = new JFrame(“Prueba Imagen Giratoria”);  
  9.         jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  10.         jf.setSize(200250);  
  11.   
  12.         final JPanelImagenGiratoria ig = new JPanelImagenGiratoria();  
  13.   
  14.         final JSlider js = new JSlider(0360);  
  15.         js.addChangeListener(new javax.swing.event.ChangeListener() {  
  16.   
  17.             public void stateChanged(javax.swing.event.ChangeEvent evt) {  
  18.                 ig.setGrados(js.getValue());  
  19.             }  
  20.         });  
  21.         js.setValue(0);  
  22.   
  23.         jf.setLayout(new BorderLayout());  
  24.         jf.add(ig, BorderLayout.CENTER);  
  25.         jf.add(js, BorderLayout.SOUTH);  
  26.   
  27.         jf.setLocationRelativeTo(null);  
  28.         jf.setVisible(true);  
  29.     }  
  30. }  

Imágenes:

                                                                                                                                                                                      

Fuente: http://lefunes.wordpress.com/2008/05/30/rotando-una-imagen-a-traves-de-javaawtgeomaffinetransform/

Leave a Reply

You must be logged in to post a comment.