Bonjour tout le monde,

J'ai cherché sur le forum mais je n'ai pas trouvé de solution à mon problème alors désolée si je relance un vieux sujet.....

J'ai une appli qui fait du dessin assez simple (trait, rond, etc...) et qui charge en fond une image SVG à l'aide de la librairie batik. Je fais des zooms et des translations sur mon dessin sans utiliser AffineTransform mais en recalculant la position des éléments de mon dessin ce qui se passent très bien.

Mon soucis est que je dois faire des zooms et des translations également sur mon image de fond. J'ai voulu utiliser Affine Transform qui me parait bien adaptée à mon problème car il faut gérer l'image svg issue de batik.
Mon soucis, c'est qu'une fois que j'ai fait un zoom, mes translations deviennent "fausses".

Je m'explique :

Quand je fais des translations, tout se passe bien (mon dessin et mon image se suivent).
Ensuite je fais un zoom (la, ca se passe bien) puis je refais une translationet ca ne fonctionnent plus. Il y a un décalage de plus en plus grand (ou petit) qui s'installe entre mon image et mon dessin.

J'espère que c'est clair car ce n'est pas facile à expliquer....
Je vous met le code de la classe qui gère le canvas avec l'image de fond. Ce canvas est inséré dans un JPanel où se dessine le dessin :

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
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
 
 
public class ZoneSVG extends JSVGCanvas implements MouseListener,MouseMotionListener,MouseWheelListener,WindowListener,KeyListener
{
             double tx;
	 double ty;
             zonedessin zd; //JPanel contenant le JSVGCanvas
	 double rapechelle;
 
	AffineTransform t;
 
	public ZoneSVG(zonedessin zd)
	{
		this.setSize(800, 700);
		this.zd=zd;
	    Color bg=new Color((float)1.0,(float)1.0,(float)1.0,(float)0.0);
	    this.setBackground(bg);	    
	    t=new AffineTransform();
	}
	/**Cette fonction est la fonction de dessin sur l’interface.
         */ 
	public void paintComponent (Graphics g) 
	{
		Graphics2D g2=(Graphics2D)g;
		super.paintComponent(g2);
	}
	/**Cette fonction permet l'initialisation du canvas SVG.
         * Elle permet l'ajout des listener sur le JSVGCanvas.
         */
	public void initialisation() 
	{		
		setPreferredSize(new Dimension(800, 700));
		rapechelle=1.0;
		this.setBounds(0,0,800,700);
		addKeyListener(this);
		addMouseMotionListener(new MouseMotionAdapter()
				{ 
		      		public void mouseDragged(MouseEvent e)
		      		{ 
		      			mouvementsouris(e);
		      		}
		      								); 
		addMouseWheelListener(new MouseWheelListener()
				{ 
			public void mouseWheelMoved(MouseWheelEvent e)
      		{
      			mouvementmolette(e);
 
 
      		}
		        }
						);		
	}
		/**Cette fonction gère ce qui se passe lorsque la souris est déplacée tout en maintenant un bouton enfoncé.*/
	public void mouvementsouris(MouseEvent e)
	{
 
//calcul de dxdepensemble et dydepensemble
						tx=dxdepensemblesvg;
	ty=dydepensemblesvg;
	t.translate(tx,ty);
 
	setRenderingTransform(t);
		}
 
	}	
	/**Cette fonction gère ce qui se passe lors d’un mouvement molette.*/
	public void mouvementmolette(MouseWheelEvent e)
	{
		int mvt;
		mvt=e.getWheelRotation();
                          if(mvt<0)
                         {
		    rapechelle=1.2;
		    t.scale(rapechelle, rapechelle);
		}
		if(mvt>0)
		{
			rapechelle=(1/1.2);
			t.scale(rapechelle,rapechelle);
		}			
	setRenderingTransform(t);
	}
}