2017-02-06 8 views
0

Je travaille sur une application HTML5 qui rend des formes sur toile. Les formes sont dessinées par l'utilisateur, en utilisant un dessin libre.Dessin sur toile après zoom

I mis en œuvre le zoom, grâce à cette réponse: https://stackoverflow.com/a/6776341/

Cependant, une fois la toile est agrandie, lorsque l'utilisateur continue à dessiner, les lignes apparaissent avec un décalage. La question est de savoir comment traduire les points afin que les lignes à tracer sous le curseur à nouveau?

Répondre

0

Lorsque vous obtenez des coordonnées de la souris à partir de l'élément <canvas>, elles sont relatives à la hauteur et à la largeur de l'élément en ce qui concerne le DOM. Ils ne changeront pas en fonction de la façon dont vous avez mis à l'échelle le contexte du canevas. Afin d'obtenir les coordonnées de la toile sous le curseur, vous devez les transformer pour correspondre à la transformation actuelle du canevas.

// mouse event coordinates 
var mouseX; 
var mouseY; 

// current canvas transforms 
var originX; 
var originY; 
var scale; 

// adjust mouse coordinates with canvas context's transforms 
var canvasX = mouseX/scale + originX; 
var canvasY = mouseY/scale + originY; 

// should draw a rectangle with the cursor being directly in the center 
context.fillRect(canvasX - 10, canvasY - 10, 20, 20); 
+0

Merci, j'ai essayé cela sur l'exemple d'application et cela a bien fonctionné. Encore une petite question, s'il vous plaît: Dans son exemple, il y a un code comme ceci - 'context.translate ( - (mousex/scale + originx - mousex/(scale * zoom)) );'. Je ne comprends pas cette partie: '- mousex/(échelle * zoom)'. Qu'est-ce que ça fait? – Joachim

+0

'scale * zoom' est le nouveau facteur d'échelle. Cet exemple divise la coordonnée de la souris par cette nouvelle échelle et la soustrait des coordonnées de la souris divisées par l'ancienne échelle, en enregistrant effectivement dans 'originx' et' originy' * de quelle magnitude l'origine a changé * en raison de l'échelle. –

+0

Merci beaucoup! – Joachim