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

Friday, 30 May 2008

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)

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

Ejemplo

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

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;

public class JPanelImagenGiratoria extends javax.swing.JPanel {

    private int grados = 0;

    public int getGrados() {
        return grados;
    }

    public void setGrados(int grados) {
        this.grados = grados;
        repaint();
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g); //se borra el contenido anterior

        double r = Math.toRadians(grados); //se convierte a radianes lo grados

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

        //se dibuja
        g.setColor(Color.BLUE);
        g.drawRect(50, 50, 100, 100);

    }
}

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

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JSlider;

public class PruebaPanel{

    public static void main(String[] args) {
        final JFrame jf = new JFrame("Prueba Imagen Giratoria");
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(200, 250);

        final JPanelImagenGiratoria ig = new JPanelImagenGiratoria();

        final JSlider js = new JSlider(0, 360);
        js.addChangeListener(new javax.swing.event.ChangeListener() {

            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                ig.setGrados(js.getValue());
            }
        });
        js.setValue(0);

        jf.setLayout(new BorderLayout());
        jf.add(ig, BorderLayout.CENTER);
        jf.add(js, BorderLayout.SOUTH);

        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
    }
}

Imágenes:

Más Info


Thumbnail Screenshots by Thumbshots