Table des matières
Position réelle de la souris dans le canevas
Le scénario simple 1:1
Élément et bitmap de tailles différentes
Transformations de contexte appliquées
Maison interface Web js tutoriel Comment obtenir la vraie position de la souris sur un canevas HTML5 ?

Comment obtenir la vraie position de la souris sur un canevas HTML5 ?

Dec 05, 2024 am 11:25 AM

How to Get the Real Mouse Position on an HTML5 Canvas?

Position réelle de la souris dans le canevas

Pour dessiner dans un canevas HTML5 à l'aide du curseur de la souris, il est souvent impératif que le canevas soit positionné à l'origine (0,0 ) dans le conteneur parent. Cependant, si la position du canevas est ajustée à l'écart de l'origine, des écarts peuvent survenir lors du dessin.

Le scénario simple 1:1

Si les dimensions de l'élément du canevas s'alignent parfaitement avec la taille du bitmap (1 :1), utilisez l'extrait suivant pour capturer les positions de la souris :

function getMousePos(canvas, evt) {
  var rect = canvas.getBoundingClientRect();
  return {
    x: evt.clientX - rect.left,
    y: evt.clientY - rect.top
  };
}

Intégrez cette méthode dans votre événement, en fournissant l'événement et le canevas comme arguments. Il renvoie un objet détaillant les positions x et y de la souris. Soustrayez la position du canevas pour l'aligner avec l'élément lui-même.

var canvas = document.getElementById("imgCanvas");
var context = canvas.getContext("2d");

function draw(evt) {
  var pos = getMousePos(canvas, evt);

  context.fillStyle = "#000000";
  context.fillRect(pos.x, pos.y, 4, 4);
}

Élément et bitmap de tailles différentes

Lorsque le canevas et le bitmap diffèrent en taille, par exemple en raison d'une mise à l'échelle CSS ou d'un aspect de pixel différent ratios, ajustez les calculs comme suit :

function getMousePos(canvas, evt) {
  var rect = canvas.getBoundingClientRect(), // abs. size of element
    scaleX = canvas.width / rect.width, // relationship bitmap vs. element for x
    scaleY = canvas.height / rect.height; // relationship bitmap vs. element for y

  return {
    x: (evt.clientX - rect.left) * scaleX, // scale mouse coordinates after adjusting for element relativity
    y: (evt.clientY - rect.top) * scaleY // scale mouse coordinates after adjusting for element relativity
  };
}

Transformations de contexte appliquées

Si le contexte du canevas a subi des transformations telles que la rotation ou la mise à l'échelle, calculez l'inverse de la matrice actuelle pour en tenir compte. Les navigateurs les plus récents offrent un accès à la transformation actuelle via la propriété currentTransform, tandis que Firefox propose une matrice inversée via mozCurrentTransformInverted.

Si un calcul matriciel personnalisé est nécessaire, implémentez votre propre solution ou utilisez des bibliothèques existantes comme celle fournie sur : [ Solution matricielle personnalisée](https://github.com/bebraw/calcGeometryFromPointOnTransformedCanvas)

Appliquer la matrice inverse au les coordonnées de la souris après avoir ajusté la relativité des éléments pour les aligner sur la position correcte de la souris.

var pos = getMousePos(canvas, e); // get adjusted coordinates as described above
var imatrix = matrix.inverse(); // obtain the inverse matrix somehow
pos = imatrix.applyToPoint(pos.x, pos.y); // apply inverse matrix to adjusted coordinate

context.fillStyle = "#000000";
context.fillRect(pos.x - 1, pos.y - 1, 2, 2);

Alternativement, si l'utilisation de currentTransform est réalisable :

var pos = getMousePos(canvas, e); // get adjusted coordinates as described above
var matrix = ctx.currentTransform; // W3C (future)
var imatrix = matrix.invertSelf(); // invert

// apply to point:
var x = pos.x * imatrix.a + pos.y * imatrix.c + imatrix.e;
var y = pos.x * imatrix.b + pos.y * imatrix.d + imatrix.f;

Pour des simplifications supplémentaires, envisagez d'utiliser une bibliothèque complète qui gère toutes ces étapes, comme celle gratuite sous licence MIT mentionnée dans le dernier bloc de code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Rimworld Odyssey Comment pêcher
1 Il y a quelques mois By Jack chen
Puis-je avoir deux comptes Alipay?
1 Il y a quelques mois By 下次还敢
Guide du débutant de Rimworld: Odyssey
1 Il y a quelques mois By Jack chen
Porce de variable PHP expliquée
3 Il y a quelques semaines By 百草

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1506
276
Comment faire une demande HTTP dans Node.js? Comment faire une demande HTTP dans Node.js? Jul 13, 2025 am 02:18 AM

Il existe trois façons courantes d'initier des demandes HTTP dans Node.js: utilisez des modules intégrés, Axios et Node-Fetch. 1. Utilisez le module HTTP / HTTPS intégré sans dépendances, ce qui convient aux scénarios de base, mais nécessite un traitement manuel de la couture des données et de la surveillance des erreurs, tels que l'utilisation de https.get () pour obtenir des données ou envoyer des demandes de post via .write (); 2.AXIOS est une bibliothèque tierce basée sur la promesse. Il a une syntaxe concise et des fonctions puissantes, prend en charge l'async / attendre, la conversion JSON automatique, l'intercepteur, etc. Il est recommandé de simplifier les opérations de demande asynchrones; 3.Node-Fetch fournit un style similaire à la récupération du navigateur, basé sur la promesse et la syntaxe simple

Types de données JavaScript: référence primitive vs Types de données JavaScript: référence primitive vs Jul 13, 2025 am 02:43 AM

Les types de données JavaScript sont divisés en types primitifs et types de référence. Les types primitifs incluent la chaîne, le nombre, le booléen, le nul, un non défini et le symbole. Les valeurs sont immuables et les copies sont copiées lors de l'attribution des valeurs, de sorte qu'elles ne se affectent pas; Les types de référence tels que les objets, les tableaux et les fonctions stockent les adresses de mémoire, et les variables pointant vers le même objet s'afferchent mutuellement. Le typeof et l'instance de OFF peuvent être utilisés pour déterminer les types, mais prêtent attention aux problèmes historiques de typeofnull. Comprendre ces deux types de différences peut aider à écrire un code plus stable et fiable.

Comment vérifier si un tableau comprend une valeur en javascript Comment vérifier si un tableau comprend une valeur en javascript Jul 13, 2025 am 02:16 AM

Dans JavaScript, vérifiez si un tableau contient une certaine valeur. La méthode la plus courante est Inclut (), qui renvoie une valeur booléenne et la syntaxe est Array.Cuecludes (ValueToFind), par exemple les fruits.Cuels («banane») Renvoie vrai; S'il doit être compatible avec l'ancien environnement, utilisez l'indexof (), comme nombres.indexof (20)! == - 1 Renvoie True; Pour les objets ou les données complexes, une méthode () doit être utilisée pour une comparaison approfondie, telles que les utilisateurs.Some (user => user.id === 1) renvoie true.

Appareils et contextes avancés JavaScript Appareils et contextes avancés JavaScript Jul 24, 2025 am 12:42 AM

La portée de JavaScript détermine la portée d'accessibilité des variables, qui sont divisées en étendue globale, fonction et au niveau du bloc; Le contexte détermine la direction de cela et dépend de la méthode d'appel de fonction. 1. Les étendues incluent la portée globale (accessible n'importe où), la portée de la fonction (valide uniquement dans la fonction) et la portée au niveau du bloc (LET et const sont valides dans {}). 2. Le contexte d'exécution contient l'objet variable, la chaîne de portée et les valeurs de cela. Cela pointe vers global ou non défini dans la fonction ordinaire, l'appel de méthode pointe vers l'objet d'appel, le constructeur pointe vers le nouvel objet, et peut également être explicitement spécifié par appel / application / liaison. 3. La fermeture fait référence aux fonctions accédant et en se souvenant des variables de portée externes. Ils sont souvent utilisés pour l'encapsulation et le cache, mais peuvent provoquer

Comment obtenir la valeur d'un champ de saisie en JavaScript Comment obtenir la valeur d'un champ de saisie en JavaScript Jul 15, 2025 am 03:09 AM

Pour obtenir la valeur de la boîte d'entrée HTML, le noyau consiste à trouver l'élément correspondant via l'opération DOM et à lire l'attribut de valeur. 1. Utilisez Document.GetElementByid pour être le moyen le plus direct. Après avoir ajouté un ID à l'entrée, vous pouvez obtenir l'élément et lire la valeur via cette méthode; 2. Utilisez QueySelector pour être plus flexible, et vous pouvez sélectionner des éléments en fonction d'attributs tels que le nom, la classe, le type, etc.; 3. Vous pouvez ajouter des auditeurs d'événements d'entrée ou de modification pour atteindre des fonctions interactives, telles que l'obtention du contenu d'entrée en temps réel; 4. Faites attention au synchronisation d'exécution du script, aux erreurs d'orthographe et au jugement nul, et assurez-vous que l'élément existe avant d'accéder à la valeur.

Comment obtenir la valeur d'un bouton radio sélectionné avec JS? Comment obtenir la valeur d'un bouton radio sélectionné avec JS? Jul 18, 2025 am 04:17 AM

Il existe deux méthodes de base pour obtenir la valeur du bouton radio sélectionné. 1. Utilisez QuerySelector pour obtenir directement l'élément sélectionné, et utilisez l'entrée [name = "Votre nom-radio"]: Sélecteur vérifié pour obtenir l'élément sélectionné et lire son attribut de valeur. Il convient aux navigateurs modernes et a un code concis; 2. Utilisez Document.PetelementsByName pour traverser et trouver la première radio vérifiée via la boucle Nodelist et obtenir sa valeur, qui convient aux scénarios compatibles avec les anciens navigateurs ou nécessitent un contrôle manuel du processus; De plus, vous devez faire attention à l'orthographe de l'attribut de nom, à la gestion des situations non sélectionnées et à un chargement dynamique du contenu

Modèle JavaScript Literals: syntaxe et cas d'utilisation Modèle JavaScript Literals: syntaxe et cas d'utilisation Jul 13, 2025 am 02:28 AM

Les chaînes de modèle sont une fonctionnalité introduite dans JavaScriptes6, qui enveloppe le contenu avec des backticks et prend en charge l'interpolation variable et les chaînes multiplices. 1. Utilisez des backtticks pour définir des chaînes telles que ce point de vue en ligne; 2. Insérer des variables ou des expressions via $ {} Syntaxe tels que IAM $ {Age} Yearsold.; 3. Soutenez naturellement le texte multi-lignes sans ajouter manuellement Newlines. Les scénarios courants incluent la génération de contenu HTML dynamiquement, la sortie de chaîne multi-lignes et les coutures logiques conditionnelles simplifiées. Les notes incluent éviter les attaques d'injection, l'utilisation avancée des modèles de balises et garder la logique simple.

Construire des iframes de sable à sable sécurisé avec JavaScript Construire des iframes de sable à sable sécurisé avec JavaScript Jul 16, 2025 am 02:33 AM

Pour utiliser JavaScript pour créer un sandbox sable sécurisé iframe, utilisez d'abord l'attribut de bac à sable de HTML pour limiter le comportement IFRAME, tel que l'interdiction de l'exécution du script, des fenêtres contextuelles et de la soumission de formulaire; Deuxièmement, en ajoutant des jetons spécifiques tels que des scénaristes pour assouplir les autorisations au besoin; Combinez ensuite PostMessage () pour obtenir une communication inter-domaine sécurisée, tout en vérifiant strictement les sources et les données de messages; Enfin, évitez les erreurs de configuration courantes, telles que ne pas vérifier la source, ne pas configurer CSP, etc., et effectuer des tests de sécurité avant de se rendre en ligne.

See all articles