Plus rapide
Utilisation de ctx.setTransform
vous donne plus de performance que de multiples appels de matrice ctx.translate
, ctx.scale
, ctx.translate
.
Pas besoin d'inversions de transformation complexes ni d'appels coûteux à la matrice DOM pour convertir un point entre les systèmes de coordonnées du zoom et de l'écran.
Flexible
Flexibilité car vous n'avez pas besoin d'utiliser ctx.save
y ctx.restore
si vous rendez le contenu à l'aide de différentes transformations. Le retour à la transformation avec ctx.setTransform
plutôt que de détruire la fréquence d'images ctx.restore
appelez
Il est facile d'inverser la transformation et d'obtenir les coordonnées mondiales d'une position de pixel (à l'écran) et l'inverse.
Exemples
Utilisation de la souris et de la molette de la souris pour effectuer un zoom avant et arrière à la position de la souris
Un exemple d'utilisation de cette méthode pour mettre à l'échelle le contenu d'une page en un point (souris) via une transformation CSS La démo CSS au bas de la réponse contient également une copie de la démo de l'exemple suivant.
Et un exemple de cette méthode utilisée pour mettre à l'échelle le contenu du canevas en un point à l'aide de setTransform
Comment
Étant donné une échelle et une position de pixel, vous pouvez obtenir la nouvelle échelle comme suit...
const origin = {x:0, y:0}; // canvas origin
var scale = 1; // current scale
function scaleAt(x, y, scaleBy) { // at pixel coords x, y scale by scaleBy
scale *= scaleBy;
origin.x = x - (x - origin.x) * scaleBy;
origin.y = y - (y - origin.y) * scaleBy;
}
Pour positionner le canevas et dessiner le contenu
ctx.setTransform(scale, 0, 0, scale, origin.x, origin.y);
ctx.drawImage(img, 0, 0);
A utiliser si vous avez les coordonnées de la souris
const zoomBy = 1.1; // zoom in amount
scaleAt(mouse.x, mouse.y, zoomBy); // will zoom in at mouse x, y
scaleAt(mouse.x, mouse.y, 1 / zoomBy); // will zoom out by same amount at mouse x,y
Pour restaurer la transformation par défaut
ctx.setTransform(1,0,0,1,0,0);
Les inversions
Pour obtenir les coordonnées d'un point dans le système de coordonnées zoomé et la position à l'écran d'un point dans le système de coordonnées zoomé
De l'écran au monde
function toWorld(x, y) { // convert to world coordinates
x = (x - origin.x) / scale;
y = (y - origin.y) / scale;
return {x, y};
}
Du monde à l'écran
function toScreen(x, y) {
x = x * scale + origin.x;
y = y * scale + origin.y;
return {x, y};
}
16 votes
Vous devriez accepter cette réponse ou réviser votre question