summaryrefslogtreecommitdiff
path: root/graphics/metapost/contrib/macros/repere/repere.mp
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/metapost/contrib/macros/repere/repere.mp')
-rw-r--r--graphics/metapost/contrib/macros/repere/repere.mp829
1 files changed, 806 insertions, 23 deletions
diff --git a/graphics/metapost/contrib/macros/repere/repere.mp b/graphics/metapost/contrib/macros/repere/repere.mp
index 0bd86dc43d..32fa7f30a2 100644
--- a/graphics/metapost/contrib/macros/repere/repere.mp
+++ b/graphics/metapost/contrib/macros/repere/repere.mp
@@ -2,7 +2,7 @@
%% repere.mp %%
%% Macros pour la construction de figures dans un repère %%
%% o.peault@posteo.net %%
-%% Version 19.06 (Juin 2019) %%
+%% Version 22.07 (Juillet 2022) %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% This work may be distributed and/or modified under the conditions of
@@ -16,6 +16,9 @@
% Juin 2019 : demi-droites, nomme[<angle>]
% Mars 2020 : filldraw
% Octobre 2021 : nommerot, cote
+% Juin 2022 : marquesegment plusieurs segments
+% angle_cote
+% segments, vecteurs, polygones complets
% À faire : extratextx, extratexty
input format;
@@ -89,7 +92,7 @@ enddef;
%%%%%%%%%% Définition du repère
vardef repere@#(text t)=
- if (str @#="") or (str @#="larg") or (str @#="orth") or (str @#="prop"):
+ if (str @#="") or (str @#="larg") or (str @#="width") or (str @#="orth") or (str @#="prop"):
definitionrepere@#(t)
else:
reperenum@#(t)
@@ -113,7 +116,7 @@ vardef definitionrepere@#(text t) =
_def[7]:=90;i:=1;
for _i=t: _def[i]:=_i; i:=i+1; endfor;
Xmin:=_def1; Xmax:=_def2; Ymin:=_def4; Ymax:=_def5; theta:=_def7;
- if str @#="larg": _def3:=(_def3-_def6*cosd(theta)/sind(theta))/(Xmax-Xmin);_def6:=_def6/((Ymax-Ymin)*sind(theta))
+ if (str @#="larg") or (str @#="width"): _def3:=(_def3-_def6*cosd(theta)/sind(theta))/(Xmax-Xmin);_def6:=_def6/((Ymax-Ymin)*sind(theta))
elseif str @#="orth": _def3:=_def3/(Xmax-Xmin); _def6:=_def3;theta:=90
elseif str @#="prop": _def3:=_def3/(Xmax-Xmin); _def6:=_def6*_def3;theta:=90
fi;
@@ -1016,7 +1019,7 @@ vardef nommepoint@#(text t)=
pair $;
string ch,latch;
picture dess;
- if (ASCII str @# < 58) or (ASCII str @# = 91):
+ if ((ASCII str @# < 58) or (ASCII str @# = 91)) and (str @#<>""):
def mylabel = labelang enddef
else:
def mylabel = label enddef
@@ -1240,7 +1243,7 @@ vardef nommeautoobj(text t)=
enddef;
-
+% obsolète juin 2022
vardef vecteur@#(expr A)(text t)=
save $,ch,m;
picture $;
@@ -1258,6 +1261,13 @@ vardef vecteur@#(expr A)(text t)=
$
enddef;
+% juin 2022
+def drawvecteur(expr A,u)=
+ drawarrow A--A+u
+enddef;
+
+
+
vardef marquepointcourbefig(suffix p)(text t)=
save $;
picture $;
@@ -1676,7 +1686,7 @@ vardef splineinterpolderfonct_coul(text t)(expr x)=
else:
pta:=ptb;
ptb:=i;
- if x< redpart ptb: sortie:=true fi;
+ if x<= redpart ptb: sortie:=true fi;
fi;
exitif sortie;
endfor
@@ -1819,11 +1829,11 @@ enddef;
numeric longtan;
longtan:=20;
-vardef tangentefleche@# (suffix p)(text tt) =
- save t,$,pp,i,N;
+vardef tangentefleche@# (expr p)(text tt) =
+ save t,$,pp,i,N,c;
pair senstan.gauche,senstan.droite,senstan.double;
senstan.gauche=(1,0);senstan.droite=(0,1);senstan.double=(1,1);
- numeric N[],i;
+ numeric N[],i,c;
i:=0;
pair _v,M;
picture $;
@@ -1831,23 +1841,29 @@ senstan.gauche=(1,0);senstan.droite=(0,1);senstan.double=(1,1);
if i=1: N2:=longtan fi;
(t,whatever) = p intersectiontimes ((N1,Ymin)--(N1,Ymax));
M:=point t of p;
+ c:= ypart direction t of p;
_v:=N2*unitvector(direction t of p);
$=image(%
MarquePoint(M);
if (xpart senstan@#) <> 0: olddrawarrow _cart(M)--_cart(M)-_v*(xpart senstan@#) fi;
if (ypart senstan@#) <> 0: olddrawarrow _cart(M)--_cart(M)+_v*(ypart senstan@#) fi;
);
+% $=image(%
+% drawdblarrow (M-)--(M+ )
+% );
$
enddef;
vardef tangentedroite(expr p,a) =
- save $,m,M,t;
+ save $,m,M,t,c;
path $;
- numeric m,t;
+ numeric m,t,c;
pair M;
(t,whatever) = p intersectiontimes ((a,Ymin)--(a,Ymax));
M:=point t of p;
- $=M-_diag*unitvector(direction t of p)--M+_diag*unitvector(direction t of p);
+ c:= (ypart direction t of p)/(xpart direction t of p);
+% $=M-_diag*unitvector(direction t of p)--M+_diag*unitvector(direction t of p);
+ $=droite(c,ypart M - (xpart M)*c);
$
enddef;
@@ -2602,7 +2618,8 @@ vardef marqueunique_s(expr A,B)=
((-taille_marque_s*unitvector(_cart(A)-_cart(B))/2)--(taille_marque_s*unitvector(_cart(A)-_cart(B))/2)) rotated angle_marque_s
enddef;
-vardef marquesegment(expr A,B,n)=
+
+vardef marqueseg(expr A,B,n)=
save $;
picture $;
$=image(
@@ -2613,6 +2630,733 @@ vardef marquesegment(expr A,B,n)=
$ shifted milieu(_cart(A),_cart(B))
enddef;
+vardef marquesegment(text t)=
+ save n,N,Pti,Ptii,tmpfig;
+ numeric n,N;
+ picture tmpfig;
+ pair Pti,Ptii;
+ N:=0;
+ for i=t:
+ if numeric i: n:=i fi;
+ endfor
+ tmpfig:=image(%
+ for i=t:
+ N:=N+1;
+ if ((N mod 2) = 1) and (pair i):
+ Pti := i;
+ elseif pair i:
+ Ptii := i;
+ draw marqueseg(Pti,Ptii,n);
+ fi;
+ endfor
+ );
+ tmpfig
+enddef;
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% FIGURES GÉOMÉTRIQUES COMPLÈTES %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+boolean AffPoints, AffCotes, AffAngles, AffVect, AffDonnees;
+AffPoints:=true; %
+AffCotes:=true;
+AffAngles:=false;
+AffVect:=true;
+AffDonnees:=false;
+
+string UnitCotes;
+UnitCotes:="";
+
+numeric ArrondiCotes,ArrondiAngles,EchelleAngles;
+boolean AutoAngleDroit;
+ArrondiCotes:=2;
+ArrondiAngles:=1;
+EchelleAngles:=0.8;
+AutoAngleDroit:=false;
+
+numeric rep_int_arr;
+if numbersystem="decimal": rep_int_arr:= 9 else: rep_int_arr:=4 fi;
+
+numeric rep_type_triangle; %0 : lll ; 1 : lla ; 2 : lla
+
+vardef AffichageCoteSansUnite(expr nb,arr)=
+ "\num[round-pad = false,round-mode=places,round-precision=" & decimal(arr) & "]{" & decimal(nb) & "}"
+enddef;
+
+vardef AffichageCoteAvecUnite(expr nb,arr,unit)=
+ "\SI[round-pad = false,round-mode=places,round-precision=" & decimal(arr) & "]{" & decimal(nb) & "}{" & unit & "}"
+enddef;
+
+%vardef AffichageAngle(expr nb,arr)=
+% "\ang[round-mode=places,round-pad = false,drop-zero-decimal,round-precision=" & decimal(arr) & "]{" & decimal(nb) & "}"
+%enddef;
+
+vardef AffichageAngle(expr nb,arr)=
+ "\ang{" & decimal(arrondi(10**(arr),nb)) & "}"
+enddef;
+
+
+%
+%%%%%%%%%%%%%%%% Segments %%%%%%%%%%%%%%%
+
+
+vardef SegmentComplet(expr AA,BB)(expr chAA,chBB,cotei) text t=
+%% Les extrémités étant données, trace le segment, le nom des points et la cote
+%% La position du nom est calculée automatiquement
+ save tmp,anghh,tmpana,tmpanb;
+ picture tmp;
+ numeric anghh,tmpana,tmpanb;
+ anghh:=angle(BB-AA);
+ tmpana=anghh+180 ;
+ tmpanb=anghh ;
+ tmp:=image(%
+ draw AA--BB t;
+ nomme[tmpana](AA,chAA) t withpen currentpen;
+ nomme[tmpanb](BB,chBB) t withpen currentpen;
+ cote(AA,BB,cotei) t;
+ );
+ tmp
+enddef;
+
+numeric ll_seg;
+
+vardef defSegment(suffix AA,BB)(text s)=
+%% Définit les points AA et BB en fonction de la longueur, le point de départ et l'angle
+ save count_tmp,anghh,posAA;
+ numeric count_tmp,anghh;
+ pair posAA;
+ posAA:=(0,0);anghh:=0;ll_seg:=0;
+ count_tmp:=0;
+ for i=s:
+ count_tmp:=count_tmp+1;
+ if count_tmp=1:
+ ll_seg:=i
+ elseif pair i:
+ posAA:=i
+ else:
+ anghh:=i
+ fi;
+ endfor
+ % Point A
+ if unknown AA: AA:=posAA fi;
+ % Point B
+ if unknown BB:
+ BB:=(ll_seg,0) rotated anghh shifted AA;
+ else: %du coup, on change la valeur de l et angh
+ ll_seg:=abs(BB-AA);anghh:=angle(BB-AA);
+ fi;
+enddef;
+
+vardef Segment(suffix AA,BB)(text s)(text t)=
+%% Macro utilisateur, definit les points A et B et trace la figure complète en fonctions des données
+ save ll_seg,posAA,anghh,count_tmp,chAA,chBB,chcote;
+ numeric ll_seg,anghh,count_tmp;
+ string chAA,chBB,chcote;
+ defSegment(AA,BB)(s);
+ count_tmp:=0;
+ if AffCotes:
+ if ll_seg=0:
+ chcote:=decimal(abs(BB-AA))
+ else:
+ chcote:=decimal(ll_seg)
+ fi;
+ if UnitCotes<>"":
+ chcote:="\SI[round-pad = false,round-mode=places,round-precision=" & decimal(ArrondiCotes) & "]{" & chcote & "}{" & UnitCotes & "}"
+ else:
+ chcote:="\num[round-pad = false,round-mode=places,round-precision=" & decimal(ArrondiCotes) & "]{" & chcote & "}";
+ fi
+ else:
+ chcote:=""
+ fi;
+ if AffPoints:
+ chAA:="$" & _chaine(AA) & "$";
+ chBB:="$" & _chaine(BB) & "$";
+ else:
+ chAA:="";chBB:="";
+ fi;
+ for i=t:
+ count_tmp:=count_tmp+1;
+ if count_tmp = 1: chcote:=i
+ elseif count_tmp=2: chAA:=i
+ else: chBB:=i
+ fi;
+ endfor
+ SegmentComplet(AA,BB)(chAA,chBB,chcote)
+enddef;
+
+
+
+
+%%%%%%%%%%%%%%%% Vecteurs %%%%%%%%%%%%%%%
+
+
+vardef VecteurComplet(expr AA,uu)(expr chAA,chBB,cotei) text t=
+%% Les extrémités étant données, trace le vecteur, le nom des points et le nom du vecteur
+%% La position des noms est calculée automatiquement
+ save tmp,anghh,tmpana,tmpanb,marque_p_tmp;
+ string marque_p_tmp;
+ picture tmp;
+ numeric anghh,tmpana,tmpanb;
+ anghh:=angle(uu);
+ tmpana=anghh+180 ;
+ tmpanb=anghh ;
+ marque_p_tmp:=marque_p;
+ tmp:=image(%
+ drawarrow AA--(AA+uu) t;
+ nomme[tmpana](AA,chAA) t withpen currentpen;
+ marque_p:="";
+ nomme[tmpanb](AA+uu,chBB) t;
+ marque_p:=marque_p_tmp;
+ cote(AA,AA+uu,cotei) t;
+ );
+ tmp
+enddef;
+
+pair AA_vect,uu_vect;
+
+vardef defVecteur(text t)(text s)=
+%% t peut être (u), (u,A) ou (u,A,B)
+%% Définit le vecteur u et, éventuellement, les points AA et BB en fonction de la longueur, le point de départ et l'angle
+ save anghh,count_tmp,ufixe,ll,posAA,anghh;
+ numeric anghh,count_tmp,ll;
+ pair posAA;
+ boolean ufixe;
+ ufixe:=false;
+ count_tmp:=0;
+ posAA:=(0,0);anghh:=0;ll:=0;
+ for i=s:
+ count_tmp:=count_tmp+1;
+ if count_tmp=1:
+ ll:=i
+ elseif pair i:
+ posAA:=i
+ else:
+ anghh:=i
+ fi;
+ endfor
+ count_tmp:=0;
+ forsuffixes i=t:
+ count_tmp:=count_tmp+1;
+ if count_tmp=1:
+ if unknown i:
+ i:=(ll,0) rotated anghh;
+ uu_vect:=i
+ else:
+ uu_vect:=i
+% ll:=abs(uu_vect);anghh:=angle(uu_vect)
+ fi;
+ elseif count_tmp=2:
+ if unknown i: i:=posAA fi;
+ AA_vect:=i;
+ else:
+ i:=AA_vect+uu_vect
+ fi;
+ endfor
+enddef;
+
+
+vardef Vecteur(text q)(text s)(text t) text r=
+%% Macro utilisateur, definit le vecteur u et éventuellement les points A et B et trace la figure complète en fonctions des données
+ save tmp,posAA,count_tmp,chAA,chBB,chvect,AA_vect,uu_vect,ch;
+ numeric count_tmp;
+ pair posAA,AA_vect,uu_vect;
+ string chAA,chBB,chvect,ch;
+ picture tmp;
+ defVecteur(q)(s);
+ chAA:="";chBB:="";chvect:="";
+ count_tmp:=0;
+ forsuffixes i=q:
+ count_tmp:=count_tmp+1;
+ ch:=_chaine(i);
+ if count_tmp=1:
+ if AffVect: chvect:="$\vv{" & ijmath(ch) & "}$" fi
+ elseif count_tmp=2:
+ if AffPoints: chAA:="$" & ch & "$" fi
+ else:
+ if AffPoints: chBB:="$" & ch & "$" fi
+ fi;
+ endfor
+ count_tmp:=0;
+ for i=t:
+ count_tmp:=count_tmp+1;
+ if count_tmp = 1: chvect:=i
+ elseif count_tmp=2: chAA:=i
+ else: chBB:=i
+ fi;
+ endfor
+ VecteurComplet(AA_vect,uu_vect)(chAA,chBB,chvect) r
+enddef;
+
+
+%%%%%%%%%%%%%%%% Triangles %%%%%%%%%%%%%%%
+
+pair rep_tri_AA,rep_tri_BB,rep_tri_CC;
+numeric rep_tri_la,rep_tri_lb,rep_tri_lc,
+ rep_tri_angA,rep_tri_angB,rep_tri_angC;
+
+boolean rep_ad_A,rep_ad_B,rep_ad_C;
+
+vardef TriangleComplet(suffix AA,BB,CC)(expr chAA,chBB,chCC,coteAB,coteBC,coteCA,angAA,angBB,angCC) text t =
+%% Trace le triangle, les noms des points, les cotes et le sangles
+ save tmpang,tmpfig,tmpscale;
+ numeric tmpang,tmpscale;
+ tmpscale:=defaultscale;
+ picture tmpfig;
+ tmpfig:=image(%
+ draw triangle (AA,BB,CC) t;
+ if AffPoints:
+ tmpang:=angle(0.5BB+0.5CC-AA)+180;
+ nomme[tmpang](AA,chAA) t withpen currentpen;
+ tmpang:=angle(0.5AA+0.5CC-BB)+180;
+ nomme[tmpang](BB,chBB) t withpen currentpen;
+ tmpang:=angle(0.5BB+0.5AA-CC)+180;
+ nomme[tmpang](CC,chCC) t withpen currentpen;
+ fi
+ if AffDonnees:
+ cote(AA,BB,coteAB) t;
+ if rep_type_triangle=0: cote(BB,CC,coteBC) t fi;
+ if rep_type_triangle<=1: cote(CC,AA,coteCA) t fi;
+ elseif AffCotes:
+ cote(AA,BB,coteAB) t;
+ cote(BB,CC,coteBC) t;
+ cote(CC,AA,coteCA) t;
+ fi
+ defaultscale:=EchelleAngles;
+ if AffDonnees and (rep_type_triangle<3):
+ if rep_type_triangle>=1:
+ if rep_ad_A and AutoAngleDroit:
+ draw marqueangledroit(BB,AA,CC) t withpen currentpen
+ else:
+ draw marqueangle(BB,AA,CC,1) t withpen currentpen;
+ nomme(BB,AA,CC,angAA) t;
+ fi;
+ fi;
+ if rep_type_triangle=2:
+ if rep_ad_B and AutoAngleDroit:
+ draw marqueangledroit(CC,BB,AA) t withpen currentpen
+ else:
+ draw marqueangle(CC,BB,AA,1) t withpen currentpen;
+ nomme(CC,BB,AA,angBB) t;
+ fi;
+ fi;
+ else:
+ if (nang>=1):
+ if rep_ad_A and AutoAngleDroit:
+ draw marqueangledroit(BB,AA,CC) t withpen currentpen
+ else:
+ draw marqueangle(BB,AA,CC,1) t withpen currentpen;
+ nomme(BB,AA,CC,angAA) t;
+ fi;
+ fi
+ if (nang>=2):
+ if rep_ad_B and AutoAngleDroit:
+ draw marqueangledroit(CC,BB,AA) t withpen currentpen
+ else:
+ draw marqueangle(CC,BB,AA,1) t withpen currentpen;
+ nomme(CC,BB,AA,angBB) t;
+ fi;
+ fi
+ if (nang=3):
+ if rep_ad_C and AutoAngleDroit:
+ draw marqueangledroit(AA,CC,BB) t withpen currentpen
+ else:
+ draw marqueangle(AA,CC,BB,1) t withpen currentpen;
+ nomme(AA,CC,BB,angCC) t;
+ fi;
+ fi
+ fi
+ defaultscale:=tmpscale;
+ );
+ tmpfig
+enddef;
+
+vardef defTriangleLLA(text t)(text s)=
+ save nbsommet,count_tmp,posAA,anghh,sommetdefiniA,sommetdefiniB,sommetdefiniC,ang_tmp;
+ numeric nbsommet,count_tmp,anghh,ang_tmp;
+ boolean sommetdefiniA,sommetdefiniB,sommetdefiniC;
+ pair posAA;
+ nbsommet:=0;
+ sommetdefiniA=sommetdefiniB=sommetdefiniC=false;
+ rep_ad_A:=false;rep_ad_B:=false;rep_ad_C:=false;
+ % on compte le nombre de sommets et on prend en compte lesquels sont définis
+ forsuffixes i=t:
+ nbsommet:=nbsommet+1;
+ if nbsommet=1:
+ if known i: sommetdefiniA:=true; rep_tri_AA:=i fi
+ elseif nbsommet=2:
+ if known i: sommetdefiniB:=true; rep_tri_BB:=i fi
+ else:
+ if known i: sommetdefiniC:=true; rep_tri_CC:=i fi
+ fi;
+ endfor
+ count_tmp:=0;
+ posAA:=(0,0);anghh:=0;
+ % on définit les valeurs de départ
+ for i=s:
+ count_tmp:=count_tmp+1;
+ if count_tmp=1: rep_tri_lc:=i
+ elseif count_tmp=2: rep_tri_lb:=i
+ elseif count_tmp=3: rep_tri_angA:=i
+ elseif pair i: if (not sommetdefiniA): posAA:=i fi
+ else: anghh:=i
+ fi;
+ endfor
+ % Angles droits ?
+ if rep_tri_angA=90:
+ rep_ad_A:=true
+ elseif arrondi(10**(rep_int_arr),cosd(rep_tri_angA)*rep_tri_lc) = arrondi(10**(rep_int_arr),rep_tri_lb):
+ rep_ad_C:=true
+ elseif arrondi(10**(rep_int_arr),cosd(rep_tri_angA)*rep_tri_lb) = arrondi(10**(rep_int_arr),rep_tri_lc):
+ rep_ad_B:=true
+ fi;
+ count_tmp:=0;
+ % on calcule les coordonnées des sommets
+ forsuffixes i=t:
+ count_tmp:=count_tmp+1;
+ if count_tmp=1: %On définit A s'il n'existe pas. À partir de B ou C éventuellement
+ if unknown i:
+ if sommetdefiniC and sommetdefiniB:
+ rep_tri_la:=abs(rep_tri_CC-rep_tri_BB);
+ if abs(sind(rep_tri_angA))<rep_tri_la/rep_tri_lc:
+ ang_tmp:=180-Arcsind(rep_tri_lc*abs(sind(rep_tri_angA))/rep_tri_la);
+ i:=(rep_tri_lc,0) rotated ((angle(rep_tri_CC-rep_tri_BB) mod 360) + ang_tmp);
+ else:
+ i:=(-rep_tri_lc,0) rotated anghh shifted rep_tri_BB;
+ rep_tri_angA:=(angle(rep_tri_CC-i) mod 360)-(angle(rep_tri_BB-i) mod 360);
+ fi;
+ rep_tri_lb:=abs(rep_tri_CC-i);
+ elseif sommetdefiniB: i:=(-rep_tri_lc,0) rotated anghh shifted rep_tri_BB
+% if sommetdefiniB: i:=(-rep_tri_lc,0) rotated anghh shifted rep_tri_BB
+ elseif sommetdefiniC: i=(-rep_tri_lb,0) rotated (anghh+rep_tri_angA) shifted rep_tri_CC
+ else: i:=posAA
+ fi;
+ rep_tri_AA:=i
+ else:
+ if sommetdefiniB: rep_tri_lc:= abs(rep_tri_BB-rep_tri_AA) fi;
+ if sommetdefiniC: rep_tri_lb:= abs(rep_tri_CC-rep_tri_AA) fi;
+ if sommetdefiniC and sommetdefiniB:
+ rep_tri_angA:=angle(rep_tri_CC-rep_tri_AA)-angle(rep_tri_BB-rep_tri_AA)
+ fi;
+ fi;
+ elseif count_tmp=2: %On définit B à partir de C si C existe
+ if unknown i:
+ if sommetdefiniC:
+ i:= (rep_tri_lc,0) rotated (angle(rep_tri_CC-rep_tri_AA)-rep_tri_angA) shifted rep_tri_AA
+ else:
+ i:=(rep_tri_lc,0) rotated anghh shifted rep_tri_AA
+ fi;
+ rep_tri_BB:=i
+ fi;
+ else: %On définit C s'il n'existe pas
+ if unknown i:
+ i:=(rep_tri_lb,0) rotated (angle(rep_tri_BB-rep_tri_AA)+rep_tri_angA) shifted rep_tri_AA;
+ rep_tri_CC:=i
+ fi;
+ fi;
+ endfor
+ rep_tri_la:=abs(rep_tri_CC-rep_tri_BB);
+ rep_tri_angB:=(angle(rep_tri_AA-rep_tri_BB) mod 360)-(angle(rep_tri_CC-rep_tri_BB) mod 360);
+ rep_tri_angC:=(angle(rep_tri_BB-rep_tri_CC) mod 360)-(angle(rep_tri_AA-rep_tri_CC) mod 360);
+enddef;
+
+
+vardef defTriangleLAA(text t)(text s)=
+ save nbsommet,count_tmp,posAA,anghh,sommetdefiniA,sommetdefiniB,sommetdefiniC,ang_tmp;
+ numeric nbsommet,count_tmp,anghh,ang_tmp;
+ boolean sommetdefiniA,sommetdefiniB,sommetdefiniC;
+ pair posAA;
+ nbsommet:=0;
+ sommetdefiniA=sommetdefiniB=sommetdefiniC=false;
+ rep_ad_A:=false;rep_ad_B:=false;rep_ad_C:=false;
+ % on compte le nombre de sommets et on prend en compte lesquels sont définis
+ forsuffixes i=t:
+ nbsommet:=nbsommet+1;
+ if nbsommet=1:
+ if known i: sommetdefiniA:=true; rep_tri_AA:=i fi
+ elseif nbsommet=2:
+ if known i: sommetdefiniB:=true; rep_tri_BB:=i fi
+ else:
+ if known i: sommetdefiniC:=true; rep_tri_CC:=i fi
+ fi;
+ endfor
+ count_tmp:=0;
+ posAA:=(0,0);anghh:=0;
+ % on définit les valeurs de départ
+ for i=s:
+ count_tmp:=count_tmp+1;
+ if count_tmp=1: rep_tri_lc:=i
+ elseif count_tmp=2: rep_tri_angA:=i
+ elseif count_tmp=3: rep_tri_angB:=i
+ elseif pair i: if (not sommetdefiniA): posAA:=i fi
+ else: anghh:=i
+ fi;
+ endfor
+ % Angles droits ?
+ if rep_tri_angA=90: rep_ad_A:=true elseif rep_tri_angB=90: rep_ad_B:=true elseif rep_tri_angA+rep_tri_angB=90: rep_ad_C:=true fi;
+ rep_tri_angC:=180-rep_tri_angA-rep_tri_angB;
+ count_tmp:=0;
+ % on calcule les coordonnées des sommets
+ forsuffixes i=t:
+ count_tmp:=count_tmp+1;
+ if count_tmp=1: %On définit A s'il n'existe pas. À partir de B ou C éventuellement
+ if unknown i:
+ if sommetdefiniC and sommetdefiniB:
+ i:=(rep_tri_lc,0) rotated (angle(rep_tri_CC-rep_tri_BB)+rep_tri_angB) shifted rep_tri_BB;
+ rep_tri_angA:=(angle(rep_tri_CC-rep_tri_AA) mod 360)-(angle(rep_tri_BB-rep_tri_AA) mod 360);
+ elseif sommetdefiniB: i:=(-rep_tri_lc,0) rotated anghh shifted rep_tri_BB
+ elseif sommetdefiniC:
+ rep_tri_lb:=rep_tri_lc*abs(sind(rep_tri_angB)/sind(rep_tri_angC));
+ i=(-rep_tri_lb,0) rotated (anghh+rep_tri_angA) shifted rep_tri_CC
+ else: i:=posAA
+ fi;
+ rep_tri_AA:=i
+ else:
+ if sommetdefiniB: rep_tri_lc:= abs(rep_tri_BB-rep_tri_AA) fi;
+ if sommetdefiniC: rep_tri_lb:= abs(rep_tri_CC-rep_tri_AA) fi;
+ if sommetdefiniC and sommetdefiniB:
+ rep_tri_angA:=(angle(rep_tri_CC-rep_tri_AA) mod 360)-(angle(rep_tri_BB-rep_tri_AA) mod 360);
+ rep_tri_angB:=(angle(rep_tri_AA-rep_tri_BB) mod 360)-(angle(rep_tri_CC-rep_tri_BB) mod 360);
+ fi;
+ fi;
+ elseif count_tmp=2: %On définit B à partir de C si C existe
+ if unknown i:
+ if sommetdefiniC:
+ i:= (rep_tri_lc,0) rotated (angle(rep_tri_CC-rep_tri_AA)-rep_tri_angA) shifted rep_tri_AA;
+ rep_tri_angB:=(angle(rep_tri_AA-i) mod 360)-(angle(rep_tri_CC-i) mod 360);
+ else:
+ i:=(rep_tri_lc,0) rotated anghh shifted rep_tri_AA
+ fi;
+ rep_tri_BB:=i
+ fi;
+ else: %On définit C s'il n'existe pas
+ if unknown i:
+ i = whatever[rep_tri_AA,rep_tri_BB rotatedaround(rep_tri_AA,rep_tri_angA)] = whatever[rep_tri_BB,rep_tri_AA rotatedaround(rep_tri_BB,-rep_tri_angB)];
+ rep_tri_CC:=i
+ fi;
+ fi;
+ endfor
+ rep_tri_la:=abs(rep_tri_CC-rep_tri_BB);
+ rep_tri_lb:=abs(rep_tri_CC-rep_tri_AA);
+ rep_tri_angC:=180 - rep_tri_angB - rep_tri_angA;
+enddef;
+
+
+vardef defTriangleLLL(text t)(text s)=
+ save nbsommet,count_tmp,posAA,anghh,sommetdefiniA,sommetdefiniB,sommetdefiniC,ab_tmp,or_tmp,ang_tmp;
+ numeric nbsommet,count_tmp,anghh,ab_tmp,or_tmp,ang_tmp;
+ boolean sommetdefiniA,sommetdefiniB,sommetdefiniC;
+ pair posAA;
+ nbsommet:=0;
+ sommetdefiniA=sommetdefiniB=sommetdefiniC=false;
+ rep_ad_A:=false;rep_ad_B:=false;rep_ad_C:=false;
+ % on compte le nombre de sommets et on prend en compte lesquels sont définis
+ forsuffixes i=t:
+ nbsommet:=nbsommet+1;
+ if nbsommet=1:
+ if known i: sommetdefiniA:=true; rep_tri_AA:=i fi
+ elseif nbsommet=2:
+ if known i: sommetdefiniB:=true; rep_tri_BB:=i fi
+ else:
+ if known i: sommetdefiniC:=true; rep_tri_CC:=i fi
+ fi;
+ endfor
+ count_tmp:=0;
+ posAA:=(0,0);anghh:=0;
+ % on définit les valeurs de départ
+ for i=s:
+ count_tmp:=count_tmp+1;
+ if count_tmp=1: rep_tri_lc:=i
+ elseif count_tmp=2: rep_tri_lb:=i
+ elseif count_tmp=3: rep_tri_la:=i
+ elseif pair i: if (not sommetdefiniA): posAA:=i fi
+ else: anghh:=i
+ fi;
+ endfor
+ % Angles droits ?
+ if arrondi(10**rep_int_arr,rep_tri_lc**2)=arrondi(10**rep_int_arr,(rep_tri_la)**2+(rep_tri_lb)**2):
+ rep_ad_C:=true
+ elseif arrondi(10**rep_int_arr,rep_tri_lb**2)=arrondi(10**rep_int_arr,(rep_tri_la)**2+(rep_tri_lc)**2):
+ rep_ad_B:=true
+ elseif arrondi(10**rep_int_arr,rep_tri_la**2)=arrondi(10**rep_int_arr,(rep_tri_lc)**2+(rep_tri_lb)**2):
+ rep_ad_A:=true
+ fi;
+ count_tmp:=0;
+ % on calcule les coordonnées des sommets
+ forsuffixes i=t:
+ count_tmp:=count_tmp+1;
+ if count_tmp=1: %On définit A s'il n'existe pas. À partir de B ou C éventuellement
+ if unknown i:
+ if sommetdefiniC and sommetdefiniB:
+ rep_tri_la:=abs(rep_tri_BB-rep_tri_CC);
+ ab_tmp:=((rep_tri_lc**2)+(rep_tri_la**2)-(rep_tri_lb**2))/(2*rep_tri_la);
+ or_tmp:=sqrt((rep_tri_lc**2)-(ab_tmp**2));
+ i := (ab_tmp,or_tmp) rotated angle(rep_tri_CC-rep_tri_BB) shifted rep_tri_BB;
+ elseif sommetdefiniB: i:=(-rep_tri_lc,0) rotated anghh shifted rep_tri_BB
+ elseif sommetdefiniC:
+ ang_tmp:=Arccosd(((rep_tri_lb**2)+(rep_tri_lc**2)-(rep_tri_la**2))/(2*rep_tri_lc*rep_tri_lb));
+ i:=(-rep_tri_lb,0) rotated (ang_tmp + anghh) shifted rep_tri_CC
+ else: i:=posAA
+ fi;
+ rep_tri_AA:=i
+ else:
+ if sommetdefiniB: rep_tri_lc:= abs(rep_tri_BB-rep_tri_AA) fi;
+ if sommetdefiniC: rep_tri_lb:= abs(rep_tri_CC-rep_tri_AA) fi;
+ if sommetdefiniC and sommetdefiniB:
+ rep_tri_la:= abs(rep_tri_BB-rep_tri_CC)
+ fi;
+ fi;
+ elseif count_tmp=2: %On définit B à partir de C si C existe
+ if unknown i:
+ if sommetdefiniC:
+ rep_tri_lb:=abs(rep_tri_AA-rep_tri_CC);
+ ab_tmp:=((rep_tri_la**2)+(rep_tri_lb**2)-(rep_tri_lc**2))/(2*rep_tri_lb);
+ or_tmp:=sqrt((rep_tri_la**2)-(ab_tmp**2));
+ i := (ab_tmp,or_tmp) rotated angle(rep_tri_AA-rep_tri_CC) shifted rep_tri_CC;
+ else:
+ i:=(rep_tri_lc,0) rotated anghh shifted rep_tri_AA
+ fi;
+ rep_tri_BB:=i
+ fi;
+ else: %On définit C s'il n'existe pas
+ if unknown i:
+ ab_tmp:=((rep_tri_lb**2)+(rep_tri_lc**2)-(rep_tri_la**2))/(2*rep_tri_lc);
+ or_tmp:=sqrt((rep_tri_lb**2)-(ab_tmp**2));
+ i := (ab_tmp,or_tmp) rotated angle(rep_tri_BB-rep_tri_AA) shifted rep_tri_AA;
+ rep_tri_CC:=i
+ fi;
+ fi;
+ endfor
+ rep_tri_angA:=(angle(rep_tri_CC-rep_tri_AA) -angle(rep_tri_BB-rep_tri_AA) ) mod 360;
+ rep_tri_angB:=(angle(rep_tri_AA-rep_tri_BB)-angle(rep_tri_CC-rep_tri_BB)) mod 360;
+ rep_tri_angC:=180 - rep_tri_angB - rep_tri_angA;
+enddef;
+
+vardef defTriangle(text q)=
+ save count_tmp;
+ numeric count_tmp;
+ rep_ad_A:=false;rep_ad_B:=false;rep_ad_C:=false;
+ count_tmp:=0;
+ for i=q:
+ count_tmp:=count_tmp+1;
+ if count_tmp=1: rep_tri_AA:=i
+ elseif count_tmp=2: rep_tri_BB:=i
+ else: rep_tri_CC:=i
+ fi;
+ endfor
+ rep_tri_lc:=abs(rep_tri_BB-rep_tri_AA);
+ rep_tri_lb:=abs(rep_tri_CC-rep_tri_AA);
+ rep_tri_la:=abs(rep_tri_BB-rep_tri_CC);
+ rep_tri_angA:=(angle(rep_tri_CC-rep_tri_AA) -angle(rep_tri_BB-rep_tri_AA) ) mod 360;
+ rep_tri_angB:=(angle(rep_tri_AA-rep_tri_BB)-angle(rep_tri_CC-rep_tri_BB)) mod 360;
+ rep_tri_angC:=180 - rep_tri_angB - rep_tri_angA;
+ % Angles droits ?
+ if arrondi(10**rep_int_arr,rep_tri_lc**2)=arrondi(10**rep_int_arr,(rep_tri_la)**2+(rep_tri_lb)**2):
+ rep_ad_C:=true
+ elseif arrondi(10**rep_int_arr,rep_tri_lb**2)=arrondi(10**rep_int_arr,(rep_tri_la)**2+(rep_tri_lc)**2):
+ rep_ad_B:=true
+ elseif arrondi(10**rep_int_arr,rep_tri_la**2)=arrondi(10**rep_int_arr,(rep_tri_lc)**2+(rep_tri_lb)**2):
+ rep_ad_A:=true
+ fi;
+enddef;
+
+vardef TriangleLLA(text q)(text s)(text p)(text c)(text a) text r=
+%% Macro utilisateur, definit le triangle et appelle la macro de tracé
+ defTriangleLLA(q)(s);
+ rep_type_triangle:=1;
+ ProcessAffTriangles(q)(p)(c)(a) r
+enddef;
+
+vardef TriangleLAA(text q)(text s)(text p)(text c)(text a) text r=
+%% Macro utilisateur, definit le triangle et appelle la macro de tracé
+ defTriangleLAA(q)(s);
+ rep_type_triangle:=2;
+ ProcessAffTriangles(q)(p)(c)(a) r
+enddef;
+
+vardef TriangleLLL(text q)(text s)(text p)(text c)(text a) text r=
+%% Macro utilisateur, definit le triangle et appelle la macro de tracé
+ defTriangleLLL(q)(s);
+ rep_type_triangle:=0;
+ ProcessAffTriangles(q)(p)(c)(a) r
+enddef;
+
+vardef Triangle(text q)(text p)(text c)(text a) text r=
+ defTriangle(q);
+ rep_type_triangle:=3;
+ ProcessAffTriangles(q)(p)(c)(a) r
+enddef;
+
+
+
+vardef ProcessAffTriangles(text q)(text p)(text c)(text a) text r=
+%% Gestion de l'affichage
+ save chAA,chBB,chCC,cha,chb,chc,changA,changB,changC,count_tmp,ch,nang;
+ string chAA,chBB,chCC,cha,chb,chc,changA,changB,changC,ch;
+ chAA=chBB=chCC=cha=chb=chc=changA=changB=changC="";
+ numeric count_tmp,nang;
+ % Noms des points passés en argument
+ count_tmp:=0;
+ forsuffixes i=q:
+ count_tmp:=count_tmp+1;
+ ch:=_chaine(i);
+ if count_tmp=1: chAA:=
+ elseif count_tmp=2: chBB:=
+ else: chCC:=
+ fi
+ "$" & ch & "$";
+ endfor
+ % On modifie le nom des points si des valeurs sont passées dans p
+ count_tmp:=0;
+ for i=p:
+ count_tmp:=count_tmp+1;
+ if count_tmp=1: chAA:=
+ elseif count_tmp=2: chBB:=
+ else: chCC:=
+ fi
+ i;
+ endfor
+ % Cotes données par les longueurs
+ if UnitCotes<>"":
+ cha:=AffichageCoteAvecUnite(rep_tri_la,ArrondiCotes,UnitCotes);
+ chb:=AffichageCoteAvecUnite(rep_tri_lb,ArrondiCotes,UnitCotes);
+ chc:=AffichageCoteAvecUnite(rep_tri_lc,ArrondiCotes,UnitCotes);
+ else:
+ cha:=AffichageCoteSansUnite(rep_tri_la,ArrondiCotes);
+ chb:=AffichageCoteSansUnite(rep_tri_lb,ArrondiCotes);
+ chc:=AffichageCoteSansUnite(rep_tri_lc,ArrondiCotes);
+ fi
+ % On modifie les cotes si des valeurs sont passées dans c
+ count_tmp:=0;
+ for i=c:
+ count_tmp:=count_tmp+1;
+ if count_tmp=1: cha:=
+ elseif count_tmp=2: chb:=
+ else: chc:=
+ fi
+ i;
+ endfor
+ % Angles donnés ou calculés
+ changA:=AffichageAngle(rep_tri_angA,ArrondiAngles);
+ changB:=AffichageAngle(rep_tri_angB,ArrondiAngles);
+ changC:=AffichageAngle(rep_tri_angC,ArrondiAngles);
+ % On modifie les angles si des valeurs sont passées dans a
+ count_tmp:=0;
+ for i=a:
+ count_tmp:=count_tmp+1;
+ if count_tmp=1: changA:=
+ elseif count_tmp=2: changB:=
+ else: changC:=
+ fi
+ i;
+ endfor
+ if count_tmp>0: nang:= count_tmp elseif AffAngles: nang:=3 else: nang:=0 fi;
+%
+ TriangleComplet(q)(chAA,chBB,chCC,chc,cha,chb,changA,changB,changC) r
+enddef;
+
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -2637,10 +3381,13 @@ vardef ch(expr x)=(exp(x)+exp(-x))/2 enddef;
vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef;
vardef Arctan(expr x)= pi*angle(1,x)/180 enddef;
+vardef Arctand(expr x)= angle(1,x) enddef;
vardef Arcsin(expr x)= Arctan(x/sqrt(1-x**2)) enddef;
+vardef Arcsind(expr x)= Arctand(x/sqrt(1-x**2)) enddef;
vardef Arccos(expr x)= pi/2-Arcsin(x) enddef;
+vardef Arccosd(expr x)= Arctand((sqrt(1-x**2))/x)enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -2775,6 +3522,18 @@ vardef LaTeX primary sc =
enddef;
+
+%%%% Cotes et légendes
+
+
+numeric dec_cote;
+dec_cote:=4mm;
+boolean traits_cote;
+traits_cote:=false;
+numeric angle_cote;
+angle_cote:=-1;
+
+
% Mai 2017
% Légende avec flèche
vardef thelegende@#(expr lab,p) =
@@ -2785,29 +3544,41 @@ enddef;
def legende = draw thelegende enddef;
-% Octobre 2021
+% Octobre 2021 - Juin 2022
% Cote sans flèche
vardef thecote@#(expr A, B, texte)=
save I; pair I;
- save an; numeric an;
+ save an,ac; numeric an,ac;
I=0.5[A,B];
an=angle(B-A);
+ if angle_cote = -1: ac:=an else: ac:=angle_cote fi;
if str @# ="top":
- thelabelangrot[an+90](texte,I,an)
+ thelabelangrot[an+90](texte,I,ac)
else:
- thelabelangrot[an-90](texte,I,an)
+ thelabelangrot[an-90](texte,I,ac)
fi
enddef;
def cote = draw thecote enddef;
+% Mai 2022
+% Cote sans flèche sans rotation du texte
+vardef thecoted@#(expr A, B, texte)=
+ save I; pair I;
+ save an; numeric an;
+ I=0.5[A,B];
+ an=angle(B-A);
+ if str @# ="top":
+ thelabelang[an+90](texte,I)
+ else:
+ thelabelang[an-90](texte,I)
+ fi
+enddef;
+
+def coted = draw thecoted enddef;
+
% Octobre 2021
% Cote avec flèche
-numeric dec_cote;
-dec_cote:=4mm;
-boolean traits_cote;
-traits_cote:=false;
-
vardef thecotefleche@#(expr a,b,t)=
save pp,an;
pair pp[];numeric an;
@@ -3497,7 +4268,6 @@ vardef Caisse(expr coulint,coulext)=
for i=1 upto 7:
draw (a--b) shifted (0,0.1*i) epaisseur (0.7*Ux/cm) couleur coulext;
endfor
- show Ux/cm;
draw a--b--c--d--cycle epaisseur (1.5*Ux/cm) couleur coulext;
draw a--c epaisseur (1.5*Ux/cm) couleur coulext;
draw b--d epaisseur (1.5*Ux/cm) couleur coulext;
@@ -3630,3 +4400,16 @@ vardef Fleche(expr coulint,coulext)=
draw tmp couleur coulext)
enddef;
+%%%%%%% Anglicisation
+let coordxy = repere;
+let endxy = fin;
+let xaxis = axex;
+let yaxis = axey;
+let axis = axes;
+let interaxis = interaxes;
+let setlab = setval;
+let arrowaxis = flecheaxe;
+let frame = cadre;
+
+
+let purple = pourpre;