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

![$[AB]](canvas-dessin-fleche-IMG/2.png)

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.
![\fbox{\psset{unit=1.4cm,linewidth=1.2pt,arrowsize=7pt}
\begin{pspicture}(-1,-1)(7,5)
% \psline[arrowsize=14pt,arrowlength=2,arrowinset=1.2]{->}(1,1)(5,3)
\psline(0,2)(6,2)
\psline(4.2,3.4)(6,2)(4.2,0.6)
\psline[linewidth=1.5pt,linestyle=dotted,linecolor=blue](4.2,3.4)(4.2,0.6)
\rput(-0.1,2.2){\large$A$}\rput(0,1.97){\Large$\bullet$}
\rput(6.2,2.2){\large$B$}\rput(6,1.97){\Large$\bullet$}
\rput(3.9,2.2){\large$C$}\rput(4.2,1.97){\Large\blue$\bullet$}
\rput(4.2,3.6){\large$D$}\rput(4.2,3.37){\Large\blue$\bullet$}
\rput(4.2,.3){\large$E$}\rput(4.2,.57){\Large\blue$\bullet$}
%
\psline{<->}(3.6,2.1)(3.6,3.5)\rput{90}(3.3,2.8){\small ArrowWidth}
\psline{<->}(3.6,1.9)(3.6,.5)\rput{90}(3.3,1.2){\small ArrowWidth}
\psline{<->}(4.2,-0.2)(6,-.2)\rput(5.1,-.45){\small ArrowLength}
\end{pspicture}}](canvas-dessin-fleche-bis-IMG/1.png)
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,
![\la\begin{array}{lcl}
xB'-xB&=&\text{ArrowInset}\tm\dfrac{xB-xA}{AB}\\[.4cm]
yB'-yB&=&\text{ArrowInset}\tm\dfrac{yB-yA}{AB}\\
\enar\right.](canvas-dessin-fleche-bis-IMG/3.png)
ou encore,
![\la\begin{array}{lcl}
xB'&=&xB+\text{ArrowInset}\tm\dfrac{xB-xA}{AB}\\[.4cm]
yB'&=&yB+\text{ArrowInset}\tm\dfrac{yB-yA}{AB}\\
\enar\right.](canvas-dessin-fleche-bis-IMG/4.png)
<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: