diff options
Diffstat (limited to 'Master/texmf-dist/metapost/repere/repere.mp')
-rw-r--r-- | Master/texmf-dist/metapost/repere/repere.mp | 829 |
1 files changed, 806 insertions, 23 deletions
diff --git a/Master/texmf-dist/metapost/repere/repere.mp b/Master/texmf-dist/metapost/repere/repere.mp index 0bd86dc43d0..32fa7f30a23 100644 --- a/Master/texmf-dist/metapost/repere/repere.mp +++ b/Master/texmf-dist/metapost/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; |