Dessiner une flèche / vecteur dans canvas avec la bonne orientation !
Un modèle plus complet
Ce modèle de flèche ou de vecteur est juste un peu plus complet que celui proposé précédemment .
La fonction Vecteur(xA,yA,xB,yB,ArrowLength,ArrowWidth) détaillée ci-dessous trace le vecteur , c'est-à-dire le segment ainsi que la flèche au point orientée convenablement.
Les paramètres sont
- et : les coordonnées de l'origine
- et : les coordonnées de l'extrémité
- ArrowLength et ArrowWidth: deux paramètres optionnels et qui désignent deux paramètres de taille pour le dessin de la flèche, tel que représenté ci-dessous:
- ArrowInset: paramètre optionnel aussi et fixant la profondeur de la flèche.
Il ne reste, par rapport au cas précédent, qu' à calculer les coordonnées du point B'.
On a la relation de proportionnalité (ou plus exactement pour des vecteurs, de colinéarité) ,
soit,
ou encore,
<canvas id="canvas" width="300" height="200" ></canvas>
<script>
Width=document.getElementById("canvas").width;
Height=document.getElementById("canvas").height;
canvas = document.getElementById("canvas");
ctx = canvas.getContext("2d");
function Norm(xA,yA,xB,yB) {return Math.sqrt(Math.pow(xB-xA,2)+Math.pow(yB-yA,2));}
function Vecteur (xA,yA,xB,yB,ArrowLength,ArrowWidth,ArrowInset) {
if (ArrowLength === undefined) {ArrowLength=10;}
if (ArrowWidth === undefined) {ArrowWidth=8;}
if (ArrowInset === undefined) {ArrowInset=10;}
ctx.lineCap="round";ctx.fillStyle=ctx.strokeStyle;
// Calculs des coordonnées des points B' (ici Bp), C, D et E
AB=Norm(xA,yA,xB,yB);
xBp=xB+ArrowInset*(xB-xA)/AB;yBp=yB+ArrowInset*(yB-yA)/AB;
xC=xB+ArrowLength*(xA-xB)/AB;yC=yB+ArrowLength*(yA-yB)/AB;
xD=xC+ArrowWidth*(-(yB-yA))/AB;yD=yC+ArrowWidth*((xB-xA))/AB;
xE=xC-ArrowWidth*(-(yB-yA))/AB;yE=yC-ArrowWidth*((xB-xA))/AB;
// et on trace le segment [AB], et sa flèche:
ctx.beginPath();
ctx.moveTo(xA,yA);ctx.lineTo(xB,yB);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(xD,yD);ctx.lineTo(xB,yB);ctx.lineTo(xE,yE);ctx.lineTo(xBp,yBp);
ctx.fill();
}
// Et 3 exemples d'utilisation:
ctx.strokeStyle="red";
Vecteur(30,180,120,150);
ctx.strokeStyle="blue";
ctx.lineWidth=4;
ArrowLength=10;ArrowWidth=18;ArrowInset=30;
Vecteur(200,100,30,25,ArrowLength,ArrowWidth,ArrowInset);
ctx.strokeStyle="green";
ctx.lineWidth=2;
ArrowLength=6;ArrowWidth=4;ArrowInset=5;
for (i=0;i<15;i++) {
Vecteur(240,30+10*i,260,20+10*i,ArrowLength,ArrowWidth,ArrowInset);
}
</script>
Voir aussi: