Ligne en pointillés dans canvas
Style en javascript
… ou comment tracer des lignes en pointillés (line style: dashed)
On trace une ligne en pointillés en alternant de courts segments.
La fonction globale DashedLine(xA,yA,xB,yB,L,l) trace ceci, en utilisant 6 paramètres:
- et : les coordonnées du point , une des deux extrémités du segment
- et : les coordonnées du point , l'autre extrémité du segment
- et les deux longueurs, en pixels, respectivement de la longueur des tirets utilisés et de l'espacement entre chque tiret.
Exemples de valeurs pour et : longueurs des tirets et espacements:
Code javascript et exemples d'utilisation
- Code: Select all
-
<canvas id="canvas" width="300" height="200" style="border: 2px solid black;"></canvas>
<script>
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 DashedLine(xA,yA,xB,yB,L,l) {
Nhatch=Norm(xA,yA,xB,yB)/(L+l);
x1=xA;y1=yA;
for (i=0;i < Nhatch; i++) {
newXY=Hatch(xA,yA,xB,yB,x1,y1,L);
x2=newXY[0];y2=newXY[1];
ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.stroke();
newXY=Hatch(xA,yA,xB,yB,x2,y2,l);
x1=newXY[0];
y1=newXY[1];
}
}
function Hatch(xA,yA,xB,yB,x1,y1,l) {
a=(yB-yA)/(xB-xA);b=yA-a*xA;// Equation reduite y=ax+b de (AB):
if ((xB-xA)>0) {sgn=1;} else {sgn=-1;}
x2=sgn*l/Math.sqrt(1+a*a)+x1;
y2=a*x2+b;
if (Norm(x1,y1,x2,y2)>Norm(x1,y1,xB,yB)) {x2=xB;y2=yB;}
return [x2,y2];
}
// Et 4 exemples d'utilisation:
xA=10;yA=20;
xB=200;yB=50;
DashedLine(xA,yA,xB,yB,20,5);
ctx.strokeStyle = "red";ctx.lineWidth=3;
xA=10;yA=50;xB=250;yB=100;
DashedLine(xA,yA,xB,yB,20,5);
ctx.strokeStyle = "green";ctx.lineWidth=2;
xA=10;yA=160;xB=250;yB=130;
DashedLine(xA,yA,xB,yB,50,5);
ctx.strokeStyle = "blue";
xA=10;yA=180;xB=280;yB=180;
DashedLine(xA,yA,xB,yB,2,2);
</script>
- Affichage:
Détails et explications sur le code et les calculs effectués
Pour tracer cette ligne pointillée, on part du point initialement confondu avec le point , soit et .
On cherche alors le point tel que et . On trace alors le segment .
On réitère ensuite en prenant et en cherchant cette fois le nouveau point tel que , mais sans tracer le segmet correspondant cette fois.
On recommence ensuite…
Cette boucle est implémentée dans la fonction DashedLine.
Il reste à déterminer les coordonnées du point ; la fonction Hatch s'en charge.
Détails de la fonction Hatch
On cherche donc les coordonnées du point telles que et et plus précisément .Tout d'abord, si on connaît l'équation réduite de la droite , alors la condition se caractérise par .
Equation réduite de la droite
L'équation réduite s'écrit .Le coefficient directeur se calcule suivant .
Ensuite, comme par exemple , on a , et donc l'ordonnée à l'origine se trouve par la relation .
On calcule ainsi simplement les coefficients et .
Calcul des coordonnées de
Ensuite, se traduit parOr on a vu que , et comme on part d'un point qui est aussi un point de la droite , on a aussi Ainsi, , et alors
On tourve ainsi deux possibilités pour :
ou
Ces deux valeurs sont les deux abscisses possibles pour :
Il reste donc à choisir le point . On choisit pour cela le même signe dans l'expression de que dnas la différence :
- si , est à droite de dans le canvas, et donc aussi .
- si , c'est le contraire.
En résumé, on a:
et alors, .
Dernière chose: il faut que et en particulier il ne faut pas avoir "dépassé" le point ; si alors on a dépassé et on retourne pour les coordonnées de .
Voir aussi: