1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
public class TestRotation {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Canvas canvas = new MyCanvas();
frame.getContentPane().add(canvas);
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static class MyCanvas extends Canvas {
private boolean rotate;
private Shape shape;
private int mousex;
private int mousey;
public MyCanvas(){
super();
shape = createShape(50, 50, 100, 75);
setEnabled(true);
MouseAdapter mouse = new MouseAdapter() {
public void mousePressed(MouseEvent e) {
rotate=true;
mousex=e.getX();
mousey=e.getY();
repaint();
};
public void mouseReleased(MouseEvent e) {
rotate=false;
mousex=e.getX();
mousey=e.getY();
repaint();
};
@Override
public void mouseDragged(MouseEvent e) {
mousex=e.getX();
mousey=e.getY();
repaint();
}
};
addMouseMotionListener(mouse);
addMouseListener(mouse);
}
private Shape createShape(double x, double y, double w, double h) {
// on crée une forme non symétrique, pour vérifier l'angle
Area area=new Area(new Rectangle2D.Double(x, y, w,
h));
double d = Math.min(h, w)/6;
area.subtract(new Area(new Rectangle2D.Double(x+w-2*d,y+h-2*d, d*2,
d)));
return area;
}
public void paint(java.awt.Graphics g) {
((Graphics2D)g).draw(shape);
if ( rotate ) {
g.setColor(Color.RED);
// centre de la forme
double cx = shape.getBounds().getCenterX();
double cy = shape.getBounds().getCenterY();
// position relative de la souris au centre de la forme
double dx = mousex-cx;
double dy = mousey-cy;
// angle de rotation
double angle = Math.PI/2-Math.atan2(dx, dy);
((Graphics2D)g).draw(AffineTransform.getRotateInstance(angle, cx, cy).createTransformedShape(shape));
}
}
}
} |
Partager