Bonjour,
Le titre dit presque tout : j'ai une image que j'affiche et sur laquelle, suite à un choix d'un menu contextuel, il peut y avoir des rotations selon des angles multiples de 45°.
L'image est affichée dans une JInternalFrame dont la taille est égale à la taille de l'image.
La rotation est faite par rapport au centre de l'image et se passe bien mais bien entendu une fois tournée, l'image dépasse les côtés de la fenêtre. Il faut donc appliquer une translation vers la droite et/ou vers le bas et redimensionner la fenêtre et pour cela j'ai récupéré un bout de code mais ça ne marche pas, quand je fais une rotation de +/-45° ou +/-135°, l'image n'est pas sufisamment translatée.
J'ai essayé de trouver la bonne formule (par un peu de recherche sur ce forum et ailleurs, et pas ma propre réflexion mathématique) mais sans succès. Alors si il y a un connaisseur des arcanes de la trigo ... merci d'avance.
Un bout de code :
Ma classe de la fenetre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public class FenetreSceneEtre extends JInternalFrame{ private BufferedImage image; public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.drawImage(image, 0, 0, null); } private void reOrienterImage(double angle) { // rotation de l'image tournerImage(image, angle); // retailler la fenetre hauteur = image.getHeight(); largeur = image.getWidth(); setSize(largeur, hauteur); } public void tournerImage(BufferedImage image,double angle) { double angleRad = Math.toRadians(angle); double sinA = Math.sin(angleRad); // Rotation AffineTransform tx = new AffineTransform(); tx.rotate(angleRad,image.getWidth()/2, image.getHeight()/2); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); // ************************** // Translation // LA OU CE SITUE LE PROBLEME !!!! // ************************** Rectangle rect = op.getBounds2D(image).getBounds(); tx.translate(sinA * rect.getX(), -sinA * rect.getY()); op = new AffineTransformOp(tx,AffineTransformOp.TYPE_BILINEAR); image = op.filter(image, op.createCompatibleDestImage(image, null) ); } }
La fonction appelée depuis le menu popup :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public void tournerSceneEtre(FenetreSceneEtre fenetre, double angle) { fenetre.reOrienterImage(angle); fenetre.repaint(); }
Partager