diff options
Diffstat (limited to 'macros/latex/contrib/profcollege/latex/PfCReperage.tex')
-rw-r--r-- | macros/latex/contrib/profcollege/latex/PfCReperage.tex | 2095 |
1 files changed, 2095 insertions, 0 deletions
diff --git a/macros/latex/contrib/profcollege/latex/PfCReperage.tex b/macros/latex/contrib/profcollege/latex/PfCReperage.tex new file mode 100644 index 0000000000..347ed19498 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCReperage.tex @@ -0,0 +1,2095 @@ +%%% +% Reperage +%%% +\setKVdefault[ClesReperage]{Unitex=1,Pasx=1,Unitey=1,Pasy=1,Unitez=1,Pasz=1,DemiDroite=false,Droite=false,Plan=false,Trace=false,ListeSegment={},Espace=false,Sphere=false,AnglePhi=30,CouleurLa=white,CouleurLon=Tomato,AffichageNom=false,AffichageGrad=false,AffichageAbs=0,AffichageCoord=false,LectureCoord=false,ValeurUnitex=1,ValeurUnitey=1,ValeurOrigine=0,NomOrigine=O,EchelleEspace=50,CouleurCoord=black,Thermometre=false,Mercure=false,CouleurMercure=black,Celsius,Kelvin=false,Farenheit=false,ValeurMin=-4000,ValeurMax=4000,Etages=4,Code=false} +\defKV[ClesReperage]{Traces=\setKV[ClesReperage]{Code}} +% ValeurOrigine permet de faire des morceaux de demi-droite gradu\'ee en passant par droite :) + +\def\Updatetoksdroite#1/#2\nil{\addtotok\toklistepointdroite{#1,"#2",}} +\def\Updatetoksdroite#1/#2\nil{\addtotok\toklistepointdroite{#1,"#2",}} +\def\Updatetoksdemidroite#1/#2\nil{\addtotok\toklistenompointdemidroite{"#2",}} +\def\Updatetoksrepere#1/#2/#3\nil{\addtotok\toklistepointrepere{#1,#2,"#3",}} +\def\Updatetoksespace#1/#2/#3/#4\nil{\addtotok\toklistepointespace{#1,#2,#3,"#4",}} + +\newtoks\toklistepointrepere% +\newtoks\toklistepointdroite% +\newtoks\toklistepointdemidroite% +\newtoks\toklistenompointdemidroite% +\newtoks\toklistepointespace% + +% Pour construire le rep\`ere de l'espace +\def\buildespace{% + \toklistepointespace{}% + \ifboolKV[ClesReperage]{Sphere}{% + \foreachitem\compteur\in\ListePointEspace{\expandafter\Updatetoksrepere\compteur\nil}% + \[\MPEspaceSphere{\the\toklistepointrepere}{\useKV[ClesReperage]{EchelleEspace}}\] + }{% + \foreachitem\compteur\in\ListePointEspace{\expandafter\Updatetoksespace\compteur\nil}% + \ifboolKV[ClesReperage]{AffichageNom}{% + \ifboolKV[ClesReperage]{AffichageCoord}{% + \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{3}{\useKV[ClesReperage]{EchelleEspace}}\]% + }{% + \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{2}{\useKV[ClesReperage]{EchelleEspace}}\]% + }% + }{% + \ifboolKV[ClesReperage]{AffichageCoord}{% + \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{1}{\useKV[ClesReperage]{EchelleEspace}}\]% + }{% + \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{0}{\useKV[ClesReperage]{EchelleEspace}}\]% + }% + }% + }% +}% + +\def\MPEspaceSphere#1#2{% + \ifluatex + \begin{mplibcode} + typetrace:="3D"; + typerepre:="persp"; + anglephi:=\useKV[ClesReperage]{AnglePhi}; + Initialisation(1500,anglephi,10,#2); + color O,A,B,C,D,Z,M[]; + O=(0,0,0); + A=(cosd(anglephi+90),sind(anglephi+90),0); + B=(cosd(anglephi+180),sind(anglephi+180),0); + C=(1,0,0); + D=(0,1,0); + Z=(0,0,1); + trace cercles(O,A,O,A,Z) withcolor 0.7white; + path Equateur; + Equateur=cercles(O,C,O,C,D); + trace (subpath((0.25+anglephi/360)*length Equateur,(0.75+anglephi/360)*length Equateur) of Equateur) dashed evenly withcolor 0.7white; + trace (subpath((0.75+anglephi/360)*length Equateur,(1.25+anglephi/360)*length Equateur) of Equateur) withcolor 0.7white; + path greenwich; + greenwich=cercles(O,C,O,C,Z); + trace subpath(3*length greenwich/4,5*length greenwich/4) of greenwich withcolor 0.7white; + clip currentpicture to cercles(O,A,O,A,Z); + trace chemin(C,O,Z) dashed evenly withcolor 0.85white; + trace chemin(O,2[Z,O]) dashed evenly withcolor 0.85white; + + vardef toto(text t)= + n:=1; + for p_=t: + if (n mod 3)=1: + k:=p_; + fi; + if (n mod 3)=2: + l:=p_; + fi; + if (n mod 3)=0: + M[n]=(cosd(k)*cosd(l),sind(k)*cosd(l),sind(l)); + path Codageun,Codagedeux; + if k>0: + Codageun=cercles(O,1[O,C],O,1[O,C],D) cutafter chemin(O,(cosd(k),sind(k),0)); + elseif k<0: + Codageun=cercles(O,1[O,C],O,1[O,C],D) cutbefore chemin(O,(cosd(k),sind(k),0)); + fi; + if l>0: + Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutafter chemin(O,M[n]); + elseif l<0: + Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutbefore chemin(O,M[n]); + fi; + %%%% if l>0: + %%%fill Projette(O)--Projette((cosd(k),sind(k),0))--Codagedeux--cycle withcolor \useKV[ClesReperage]{CouleurLa}; + %%%fill Projette(O)--Projette(C)--Codageun--cycle withcolor \useKV[ClesReperage]{CouleurLon}; + %%%else: + %%%fill Projette(O)--Codagedeux--Projette((cosd(k),sind(k),0))--cycle withcolor \useKV[ClesReperage]{CouleurLa}; + %%%fill Projette(O)--Codageun--Projette(C)--cycle withcolor \useKV[ClesReperage]{CouleurLon}; + %%%fi; + if unknown Codageun: else: trace Codageun; fi; + if unknown Codagedeux: else: trace Codagedeux; fi; + if \useKV[ClesReperage]{AffichageCoord}: + picture CodageUn,CodageDeux; + CodageUn=image( + if k>0: + label.bot(TEX("\scriptsize\ang{"&decimal(k)&"} E"),(0,0)); + else: + label.bot(TEX("\scriptsize\ang{"&decimal(abs(k))&"} O"),(0,0)); + fi; + ); + CodageDeux=image( + if k>0: + label.rt(TEX("\scriptsize\ang{"&decimal(l)&"} N"),(0,0)); + else: + label.lft(TEX("\scriptsize\ang{"&decimal(abs(l))&"} S"),(0,0)); + fi; + ); + fill (polygone(llcorner CodageUn,lrcorner CodageUn,urcorner CodageUn,ulcorner CodageUn) shifted(point(0.5*length Codageun) of Codageun)) withcolor blanc; + trace CodageUn shifted (point(0.5*length Codageun) of Codageun); + fill (polygone(llcorner CodageDeux,lrcorner CodageDeux,urcorner CodageDeux,ulcorner CodageDeux) shifted(point(0.5*length Codagedeux) of Codagedeux)) withcolor blanc; + trace CodageDeux shifted (point(0.5*length Codagedeux) of Codagedeux); + fi; + trace chemin(O,(cosd(k),sind(k),0)) dashed withdots scaled 0.5; + trace chemin(O,M[n]) dashed withdots scaled 0.5; + trace chemin(O,C) dashed withdots scaled 0.5; + if \useKV[ClesReperage]{AffichageNom}: + if l>0:dotlabel.top(p_,Projette(M[n])); + else: + dotlabel.bot(p_,Projette(M[n])); + fi; + fi; + fi; + n:=n+1; + endfor; + enddef; + toto(#1); + label.llft(btex \tiny \ang{0} etex,Projette(C)); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={boolean AffichageCoord; AffichageCoord=\useKV[ClesReperage]{AffichageCoord}; boolean AffichageNom; AffichageNom=\useKV[ClesReperage]{AffichageNom};anglephi:=\useKV[ClesReperage]{AnglePhi};}] + typetrace:="3D"; + typerepre:="persp"; + Initialisation(1500,anglephi,10,#2); + color O,A,B,C,D,Z,M[]; + O=(0,0,0); + A=(cosd(anglephi+90),sind(anglephi+90),0); + B=(cosd(anglephi+180),sind(anglephi+180),0); + C=(1,0,0); + D=(0,1,0); + Z=(0,0,1); + trace cercles(O,A,O,A,Z) withcolor 0.7white; + path Equateur; + Equateur=cercles(O,C,O,C,D); + trace (subpath((0.25+anglephi/360)*length Equateur,(0.75+anglephi/360)*length Equateur) of Equateur) dashed evenly withcolor 0.7white; + trace (subpath((0.75+anglephi/360)*length Equateur,(1.25+anglephi/360)*length Equateur) of Equateur) withcolor 0.7white; + path greenwich; + greenwich=cercles(O,C,O,C,Z); + trace subpath(3*length greenwich/4,5*length greenwich/4) of greenwich withcolor 0.7white; + clip currentpicture to cercles(O,A,O,A,Z); + trace chemin(C,O,Z) dashed evenly withcolor 0.85white; + trace chemin(O,2[Z,O]) dashed evenly withcolor 0.85white; + + vardef toto(text t)= + n:=1; + for p_=t: + if (n mod 3)=1: + k:=p_; + fi; + if (n mod 3)=2: + l:=p_; + fi; + if (n mod 3)=0: + M[n]=(cosd(k)*cosd(l),sind(k)*cosd(l),sind(l)); + path Codageun,Codagedeux; + if k>0: + Codageun=cercles(O,1[O,C],O,1[O,C],D) cutafter chemin(O,(cosd(k),sind(k),0)); + elseif k<0: + Codageun=cercles(O,1[O,C],O,1[O,C],D) cutbefore chemin(O,(cosd(k),sind(k),0)); + fi; + if l>0: + Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutafter chemin(O,M[n]); + elseif k<0: + Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutbefore chemin(O,M[n]); + fi; + %if l>0: + %fill Projette(O)--Projette((cosd(k),sind(k),0))--Codagedeux--cycle withcolor \useKV[ClesReperage]{CouleurLa}; + %fill Projette(O)--Projette(C)--Codageun--cycle withcolor \useKV[ClesReperage]{CouleurLon}; + %else: + %fill Projette(O)--Codagedeux--Projette((cosd(k),sind(k),0))--cycle withcolor \useKV[ClesReperage]{CouleurLa}; + %fill Projette(O)--Codageun--Projette(C)--cycle withcolor \useKV[ClesReperage]{CouleurLon}; + %fi; + if unknown Codageun: else: trace Codageun; fi; + if unknown Codagedeux: else: trace Codagedeux; fi; + if AffichageCoord: + picture CodageUn,CodageDeux; + CodageUn=image( + if k>0: + label.bot(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(k)&"} E"),(0,0)); + else: + label.bot(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(abs(k))&"} O"),(0,0)); + fi; + ); + CodageDeux=image( + if k>0: + label.rt(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(l)&"} N"),(0,0)); + else: + label.lft(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(abs(l))&"} S"),(0,0)); + fi; + ); + fill (polygone(llcorner CodageUn,lrcorner CodageUn,urcorner CodageUn,ulcorner CodageUn) shifted(point(0.5*length Codageun) of Codageun)) withcolor blanc; + trace CodageUn shifted (point(0.5*length Codageun) of Codageun); + fill (polygone(llcorner CodageDeux,lrcorner CodageDeux,urcorner CodageDeux,ulcorner CodageDeux) shifted(point(0.5*length Codagedeux) of Codagedeux)) withcolor blanc; + trace CodageDeux shifted (point(0.5*length Codagedeux) of Codagedeux); + fi; + trace chemin(O,(cosd(k),sind(k),0)) dashed withdots scaled 0.5; + trace chemin(O,M[n]) dashed withdots scaled 0.5; + trace chemin(O,C) dashed withdots scaled 0.5; + if AffichageNom: + if l>0:dotlabel.top(p_,Projette(M[n])); + else: + dotlabel.bot(p_,Projette(M[n])); + fi; + fi; + fi; + n:=n+1; + endfor; + enddef; + toto(#1); + label.llft(LATEX("\noexpand\tiny\noexpand\ang{0}"),Projette(C)); + \end{mpost} + \fi +} + +\def\MPEspacePave#1#2#3#4#5#6#7#8#9{% + \ifluatex + \begin{mplibcode} + typetrace:="3D"; + typerepre:="persp"; + Figure(-20u,-20u,20u,20u); + Initialisation(1500,30,20,abs(#9)); + %marque_r:=marque_r/2; + marque_p:="plein"; + color A,B,C,D,E,F,G,H,M[],N[]; + draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5); + if #9>0: + drawarrow Projette(A)--Projette(1.5[D,A]); + drawarrow Projette(C)--Projette(1.5[D,C]); + drawarrow Projette(E)--Projette(1.5[D,E]); + label.top(btex $x$ etex,Projette(1.5[D,A])); + label.top(btex $y$ etex,Projette(1.5[D,C])); + label.top(btex $z$ etex,Projette(1.5[D,E])); + label.ulft(btex 1 etex,Projette((1/#2)[D,A])); + label.bot(btex 1 etex,Projette((1/#4)[D,C])); + label.lft(btex 1 etex,Projette((1/#6)[D,E])); + for k=1 upto (#2): + pointe((k/#2)[D,A]); + endfor; + for k=1 upto (#4): + pointe((k/#4)[D,C]); + endfor; + for k=1 upto (#6): + pointe((k/#6)[D,E]); + endfor; + else: + drawarrow Projette(D)--Projette(1.5[A,D]) dashed evenly; + drawarrow Projette(B)--Projette(1.5[A,B]); + drawarrow Projette(F)--Projette(1.5[A,F]); + label.lrt(btex $x$ etex,Projette(1.5[A,D])); + label.top(btex $y$ etex,Projette(1.5[A,B])); + label.top(btex $z$ etex,Projette(1.5[A,F])); + label.ulft(btex 1 etex,Projette((1/#2)[A,D])); + label.bot(btex 1 etex,Projette((1/#4)[A,B])); + label.lft(btex 1 etex,Projette((1/#6)[A,F])); + for k=1 upto (#2): + pointe((k/#2)[A,D]); + endfor; + for k=1 upto (#4): + pointe((k/#4)[A,B]); + endfor; + for k=1 upto (#6): + pointe((k/#6)[A,F]); + endfor; + fi; + vardef tata(text t)= + n:=1;%pour compter combien de points + k:=0;%pour garder l'abscisse + l:=0;%pour garder l'ordonn\'ee + m:=0;%pour garder l'altitude + if #8>0: + for p_=t: + if (n mod 4)=1: + k:=p_; + fi; + if (n mod 4)=2: + l:=p_; + fi; + if (n mod 4)=3: + m:=p_; + fi; + if (n mod 4)=0: + M[n]=(k/#2)[D,A]+(l/#4)*(C-D)+(m/#6)*(E-D); + N[n]=(k/#2)[D,A]+(l/#4)*(C-D); + if (#8>1): + label.top(TEX(p_),Projette(M[n])); + pointe(M[n]); + fi; + if (#8=1) or (#8=3) : + drawoptions(dashed evenly withcolor gris); + draw segment(M[n],(0,0,bluepart(M[n]))); + draw segment(M[n],N[n]); + draw segment(N[n],(redpart(M[n]),0,0)); + draw segment(N[n],(0,greenpart(M[n]),0)); + drawoptions(); + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + vardef toto(text t)= + n:=1;%pour compter combien de points + k:=0;%pour garder l'abscisse + l:=0;%pour garder l'ordonn\'ee + m:=0;%pour garder l'altitude + if #8>0: + for p_=t: + if (n mod 4)=1: + k:=p_; + fi; + if (n mod 4)=2: + l:=p_; + fi; + if (n mod 4)=3: + m:=p_; + fi; + if (n mod 4)=0: + % message("je suis ici : "&p_); + M[n]=(k/#2)[A,D]+(l/#4)*(B-A)+(m/#6)*(F-A); + N[n]=(k/#2)[A,D]+(l/#4)*(B-A); + if (#8>1): + label.top(TEX(p_),Projette(M[n])); + pointe(M[n]); + fi; + if (#8=1) or (#8=3) : + drawoptions(dashed evenly withcolor gris); + draw segment(M[n],A+(0,0,bluepart(M[n]))); + draw segment(M[n],N[n]); + draw segment(N[n],A+(l/#4)*(B-A)); + draw segment(N[n],A+(k/#2)*(D-A)); + drawoptions(); + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + if #9>0: + tata(#7); + else: + toto(#7); + fi; + draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5); + if \useKV[ClesReperage]{Code}: + \useKV[ClesReperage]{Traces} + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={input PfCGeometrie;}] + typetrace:="3D"; + typerepre:="persp"; + Figure(-20u,-20u,20u,20u); + Initialisation(1500,30,20,abs(#9)); + %marque_r:=marque_r/2; + marque_p:="plein"; + color A,B,C,D,E,F,G,H,M[],N[]; + draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5); + if #9>0: + drawarrow Projette(A)--Projette(1.5[D,A]); + drawarrow Projette(C)--Projette(1.5[D,C]); + drawarrow Projette(E)--Projette(1.5[D,E]); + label.ulft(btex 1 etex,Projette((1/#2)[D,A])); + label.bot(btex 1 etex,Projette((1/#4)[D,C])); + label.lft(btex 1 etex,Projette((1/#6)[D,E])); + for k=1 upto (#2): + pointe((k/#2)[D,A]); + endfor; + for k=1 upto (#4): + pointe((k/#4)[D,C]); + endfor; + for k=1 upto (#6): + pointe((k/#6)[D,E]); + endfor; + else: + drawarrow Projette(D)--Projette(1.5[A,D]) dashed evenly; + drawarrow Projette(B)--Projette(1.5[A,B]); + drawarrow Projette(F)--Projette(1.5[A,F]); + label.ulft(btex 1 etex,Projette((1/#2)[A,D])); + label.bot(btex 1 etex,Projette((1/#4)[A,B])); + label.lft(btex 1 etex,Projette((1/#6)[A,F])); + for k=1 upto (#2): + pointe((k/#2)[A,D]); + endfor; + for k=1 upto (#4): + pointe((k/#4)[A,B]); + endfor; + for k=1 upto (#6): + pointe((k/#6)[A,F]); + endfor; + fi; + vardef tata(text t)= + n:=1;%pour compter combien de points + k:=0;%pour garder l'abscisse + l:=0;%pour garder l'ordonn\'ee + m:=0;%pour garder l'altitude + if #8>0: + for p_=t: + if (n mod 4)=1: + k:=p_; + fi; + if (n mod 4)=2: + l:=p_; + fi; + if (n mod 4)=3: + m:=p_; + fi; + if (n mod 4)=0: + M[n]=(k/#2)[D,A]+(l/#4)*(C-D)+(m/#6)*(E-D); + N[n]=(k/#2)[D,A]+(l/#4)*(C-D); + if (#8>1): + label.top(LATEX(p_),Projette(M[n])); + pointe(M[n]); + fi; + if (#8=1) or (#8=3) : + drawoptions(dashed evenly withcolor gris); + draw segment(M[n],(0,0,bluepart(M[n]))); + draw segment(M[n],N[n]); + draw segment(N[n],(redpart(M[n]),0,0)); + draw segment(N[n],(0,greenpart(M[n]),0)); + drawoptions(); + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + vardef toto(text t)= + n:=1;%pour compter combien de points + k:=0;%pour garder l'abscisse + l:=0;%pour garder l'ordonn\'ee + m:=0;%pour garder l'altitude + if #8>0: + for p_=t: + if (n mod 4)=1: + k:=p_; + fi; + if (n mod 4)=2: + l:=p_; + fi; + if (n mod 4)=3: + m:=p_; + fi; + if (n mod 4)=0: + % message("je suis ici : "&p_); + M[n]=(k/#2)[A,D]+(l/#4)*(B-A)+(m/#6)*(F-A); + N[n]=(k/#2)[A,D]+(l/#4)*(B-A); + if (#8>1): + label.top(LATEX(p_),Projette(M[n])); + pointe(M[n]); + fi; + if (#8=1) or (#8=3) : + drawoptions(dashed evenly withcolor gris); + draw segment(M[n],A+(0,0,bluepart(M[n]))); + draw segment(M[n],N[n]); + draw segment(N[n],A+(l/#4)*(B-A)); + draw segment(N[n],A+(k/#2)*(D-A)); + drawoptions(); + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + if #9>0: + tata(#7); + else: + toto(#7); + fi; + draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5); + \end{mpost} + \fi +}% + +% Pour construire le rep\`ere du plan +\def\buildreperenew{% + \toklistepointrepere{}% + \foreachitem\compteur\in\ListePointRepere{\expandafter\Updatetoksrepere\compteur\nil}% + \ifboolKV[ClesReperage]{Trace}{% + \[\MPPlanTrace{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\the\toklistepointrepere}{2}{\useKV[ClesReperage]{ValeurUnitex}}{\useKV[ClesReperage]{ValeurUnitey}}{\useKV[ClesReperage]{ListeSegment}}\]% + }{% + \xdef\AfficheNom{0}\ifboolKV[ClesReperage]{AffichageNom}{\ifboolKV[ClesReperage]{LectureCoord}{\xdef\AfficheNom{3}}{\xdef\AfficheNom{2}}}{\ifboolKV[ClesReperage]{LectureCoord}{\xdef\AfficheNom{1}}{}}% + \xdef\AfficheGrad{0}\ifboolKV[ClesReperage]{AffichageGrad}{\xdef\AfficheGrad{1}}{}% + \xdef\AfficheCoord{\useKV[ClesReperage]{AffichageAbs}}% + \MPPlannew{(\useKV[ClesReperage]{Unitex},\useKV[ClesReperage]{Pasx})}{(\useKV[ClesReperage]{Unitey},\useKV[ClesReperage]{Pasy})}{\the\toklistepointrepere}{\AfficheNom}{\AfficheCoord}{\AfficheGrad}{(\useKV[ClesReperage]{ValeurUnitex},\useKV[ClesReperage]{ValeurUnitey})}% + }% +} + +\def\MPPlannew#1#2#3#4#5#6#7{% + %#1 : Unitex, pasx + %#2 : unitey, pasy + %#3 : liste de points + %#4 : Affichage nom + lecture graphique + %#5 : Affichage des (abscisses/ordonn\'ees) + %#6 : Graduation compl\`ete ? + %#7 : (unitex,unitey) + \ifluatex + \begin{mplibcode} + maxx:=-4000; + minx=4000; + unitex:=(xpart(#1))*cm; + pasx=ypart(#1); + unitpx:=unitex/pasx; + maxy:=-4000; + miny:=4000; + unitey:=(xpart(#2))*cm; + pasy:=ypart(#2); + unitpy:=unitey/pasy; + n:=1; + vardef toto(text t)= + for p_=t: + if (n mod 3)=1: + if p_>maxx: + maxx:=p_; + fi; + if p_<minx: + minx:=p_; + fi; + fi; + if (n mod 3)=2: + if p_>maxy: + maxy:=p_; + fi; + if p_<miny: + miny:=p_; + fi; + fi; + n:=n+1; + endfor; + maxx:=maxx+1; + minx:=minx-1; + if maxx<(ypart(#1)+1): + maxx:=ypart(#1)+1; + fi; + if minx>(-ypart(#1)-1): + minx:=-ypart(#1)-1; + fi; + maxy:=maxy+1; + miny:=miny-1; + if maxy<(ypart(#2)+1): + maxy:=ypart(#2)+1; + fi; + if miny>(-ypart(#2)-1): + miny:=-ypart(#2)-1; + fi; + enddef; + toto(#3); + Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy); + pair A,B,C,D,E; + A=(0,0); + B=(minx*unitpx,0); + C=(maxx*unitpx,0); + D=(0,miny*unitpy); + E=(0,maxy*unitpy); + for k=0 upto (maxx-minx): + draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris; + endfor; + for k=0 upto (maxy-miny): + draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris; + endfor; + drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0)); + drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy)); + % graduation compl\`ete ou pas ? + label.llft(btex \footnotesize 0 etex,A); + if #6>0: + for k=minx upto maxx: + if (xpart((k*unitex,0))>xpart(B+(-0.75*unitpx,0))) and (xpart((k*unitex,0))<xpart(C+(0.75*unitpx,0))): + if k<>0: + dotlabel.lrt(TEX("\footnotesize\num{"&decimal(k)&"}"),(k*unitex,0)); + fi; + fi; + endfor; + for k=miny upto maxy: + if (ypart((0,k*unitey))>ypart(D+(0,-0.75*unitpy))) and (ypart((0,k*unitey))<ypart(E+(0,0.75*unitpy))): + if k<>0: + dotlabel.ulft(TEX("\footnotesize\num{"&decimal(k)&"}"),(0,k*unitey)); + fi; + fi; + endfor; + else: + dotlabel.lrt(TEX("\footnotesize\num{"&decimal(xpart(#7))&"}"),(unitex,0)); + dotlabel.ulft(TEX("\footnotesize\num{"&decimal(ypart(#7))&"}"),(0,unitey)); + fi; + % apparition du nom des points ou pas + m_c:=m_c*3; + marque_p:="croix"; + vardef tata(text t)=%on place les points + if #4>0: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if #4>1: + if p_<>"": + if (k>0) and (l>0): + label.urt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l>0): + label.urt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l=0): + label.urt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l>0): + label.ulft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l<0): + label.llft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l<0): + label.llft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l=0): + label.llft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l<0): + label.lrt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + pointe((k*unitpx,l*unitpy)); + fi; + fi; + if (#4=1) or (#4=3): + draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly; + fi; + fi; + n:=n+1; + endfor; + fi; + if #5=2: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if p_<>"": + if (k mod pasx)<>0: + label.lrt(TEX("\footnotesize$\frac{\num{"&decimal(k)&"}}{\num{"&decimal(pasx)&"}}$"),(k*unitpx,0)); + else: + label.lrt(TEX("\footnotesize\num{\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0)); + fi; + if (l mod pasy)<>0: + label.ulft(TEX("\footnotesize$\frac{\num{"&decimal(l)&"}}{\num{"&decimal(pasy)&"}}$"),(0,l*unitpy)); + else: + label.ulft(TEX("\footnotesize\num{\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy)); + fi; + pointe((k*unitpx,0),(0,l*unitpy)); + fi; + fi; + n:=n+1; + endfor; + elseif #5=1: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if p_<>"": + label.lrt(TEX("\footnotesize\num{\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0)); + label.ulft(TEX("\footnotesize\num{\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy)); + pointe((k*unitpx,0),(0,l*unitpy)); + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + tata(#3); + \end{mplibcode} + \else + \begin{mpost} + maxx:=-4000; + minx=4000; + unitex:=(xpart(#1))*cm; + pasx=ypart(#1); + unitpx:=unitex/pasx; + maxy:=-4000; + miny:=4000; + unitey:=(xpart(#2))*cm; + pasy:=ypart(#2); + unitpy:=unitey/pasy; + n:=1; + vardef toto(text t)= + for p_=t: + if (n mod 3)=1: + if p_>maxx: + maxx:=p_; + fi; + if p_<minx: + minx:=p_; + fi; + fi; + if (n mod 3)=2: + if p_>maxy: + maxy:=p_; + fi; + if p_<miny: + miny:=p_; + fi; + fi; + n:=n+1; + endfor; + maxx:=maxx+1; + minx:=minx-1; + if maxx<(ypart(#1)+1): + maxx:=ypart(#1)+1; + fi; + if minx>(-ypart(#1)-1): + minx:=-ypart(#1)-1; + fi; + maxy:=maxy+1; + miny:=miny-1; + if maxy<(ypart(#2)+1): + maxy:=ypart(#2)+1; + fi; + if miny>(-ypart(#2)-1): + miny:=-ypart(#2)-1; + fi; + enddef; + toto(#3); + Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy); + pair A,B,C,D,E; + A=(0,0); + B=(minx*unitpx,0); + C=(maxx*unitpx,0); + D=(0,miny*unitpy); + E=(0,maxy*unitpy); + for k=0 upto (maxx-minx): + draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris; + endfor; + for k=0 upto (maxy-miny): + draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris; + endfor; + drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0)); + drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy)); + % graduation compl\`ete ou pas ? + label.llft(btex \noexpand\footnotesize 0 etex,A); + if #6>0: + for k=minx upto maxx: + if (xpart((k*unitex,0))>xpart(B+(-0.75*unitpx,0))) and (xpart((k*unitex,0))<xpart(C+(0.75*unitpx,0))): + if k<>0: + dotlabel.lrt(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(k)&"}"),(k*unitex,0)); + fi; + fi; + endfor; + for k=miny upto maxy: + if (ypart((0,k*unitey))>ypart(D+(0,-0.75*unitpy))) and (ypart((0,k*unitey))<ypart(E+(0,0.75*unitpy))): + if k<>0: + dotlabel.ulft(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(k)&"}"),(0,k*unitey)); + fi; + fi; + endfor; + else: + dotlabel.lrt(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(xpart(#7))&"}"),(unitex,0)); + dotlabel.ulft(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ypart(#7))&"}"),(0,unitey)); + fi; + % apparition du nom des points ou pas + m_c:=m_c*3; + marque_p:="croix"; + vardef tata(text t)=%on place les points + if #4>0: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if #4>1: + if p_<>"": + if (k>0) and (l>0): + label.urt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l>0): + label.urt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l=0): + label.urt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l>0): + label.ulft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l<0): + label.llft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l<0): + label.llft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l=0): + label.llft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l<0): + label.lrt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + pointe((k*unitpx,l*unitpy)); + fi; + fi; + if (#4=1) or (#4=3): + draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly; + fi; + fi; + n:=n+1; + endfor; + fi; + if #5=2: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if p_<>"": + if (k mod pasx)<>0: + label.lrt(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{"&decimal(k)&"}}{\noexpand\num{"&decimal(pasx)&"}}$"),(k*unitpx,0)); + else: + label.lrt(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0)); + fi; + if (l mod pasy)<>0: + label.ulft(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{"&decimal(l)&"}}{\noexpand\num{"&decimal(pasy)&"}}$"),(0,l*unitpy)); + else: + label.ulft(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy)); + fi; + pointe((k*unitpx,0),(0,l*unitpy)); + fi; + fi; + n:=n+1; + endfor; + elseif #5=1: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if p_<>"": + label.lrt(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0)); + label.ulft(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy)); + pointe((k*unitpx,0),(0,l*unitpy)); + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + tata(#3); + \end{mpost} + \fi +} + +\def\MPPlanTrace#1#2#3#4#5#6#7#8#9{% + \ifluatex + \begin{mplibcode} + maxx:=-4000; + minx=4000; + unitex:=#1*cm; + pasx=#2; + unitpx:=unitex/pasx; + maxy:=-4000; + miny:=4000; + unitey:=#3*cm; + pasy:=#4; + unitpy:=unitey/pasy; + n:=1; + vardef toto(text t)= + for p_=t: + if (n mod 3)=1: + if p_>maxx: + maxx:=p_; + fi; + if p_<minx: + minx:=p_; + fi; + fi; + if (n mod 3)=2: + if p_>maxy: + maxy:=p_; + fi; + if p_<miny: + miny:=p_; + fi; + fi; + n:=n+1; + endfor; + maxx:=maxx+1; + minx:=minx-1; + if maxx<(#2+1): + maxx:=#2+1; + fi; + if minx>(-#2-1): + minx:=-#2-1; + fi; + maxy:=maxy+1; + miny:=miny-1; + if maxy<(#4+1): + maxy:=#2+1; + fi; + if miny>(-#4-1): + miny:=-#4-1; + fi; + enddef; + toto(#5); + Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy); + pair A,B,C,D,E; + A=(0,0); + B=(minx*unitpx,0); + C=(maxx*unitpx,0); + D=(0,miny*unitpy); + E=(0,maxy*unitpy); + for k=0 upto (maxx-minx): + draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris; + endfor; + for k=0 upto (maxy-miny): + draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris; + endfor; + drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0)); + drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy)); + dotlabel.bot(TEX("\footnotesize\num{"&decimal(#7)&"}"),(unitex,0)); + dotlabel.lft(TEX("\footnotesize\num{"&decimal(#8)&"}"),(0,unitey)); + label.llft(btex 0 etex,A); + % apparition du nom des points ou pas + m_c:=m_c*3; + marque_p:="croix"; + vardef tata(text t)=%on place les points + if #6>0: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if #6>1: + if (k>0) and (l>0): + label.urt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l>0): + label.urt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l=0): + label.urt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l>0): + label.ulft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l<0): + label.llft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l<0): + label.llft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l=0): + label.llft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l<0): + label.lrt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + pointe((k*unitpx,l*unitpy)); + fi; + if (#6=1) or (#6=3): + draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly; + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + vardef Tracage(text t)(text ls)=%on trace les segments + pair A[]; + n:=0;%pour parcourir la liste + m:=0;%pour lister les points par leur nombre + for p_=t: + n:=n+1; + if (n mod 3)=1: + k:=p_; + fi; + if (n mod 3)=2: + l:=p_; + fi; + if (n mod 3)=0: + m:=m+1; + A[m]=(k*unitpx,l*unitpy); + fi; + endfor; + for p_=ls: + draw segment(A[p_ div 10],A[p_ mod 10]); + endfor; + enddef; + tata(#5); + Tracage(#5)(#9); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={input PfCGeometrie;}] + maxx:=-4000; + minx=4000; + unitex:=#1*cm; + pasx=#2; + unitpx:=unitex/pasx; + maxy:=-4000; + miny:=4000; + unitey:=#3*cm; + pasy:=#4; + unitpy:=unitey/pasy; + n:=1; + vardef toto(text t)= + for p_=t: + if (n mod 3)=1: + if p_>maxx: + maxx:=p_; + fi; + if p_<minx: + minx:=p_; + fi; + fi; + if (n mod 3)=2: + if p_>maxy: + maxy:=p_; + fi; + if p_<miny: + miny:=p_; + fi; + fi; + n:=n+1; + endfor; + maxx:=maxx+1; + minx:=minx-1; + if maxx<(#2+1): + maxx:=#2+1; + fi; + if minx>(-#2-1): + minx:=-#2-1; + fi; + maxy:=maxy+1; + miny:=miny-1; + if maxy<(#4+1): + maxy:=#2+1; + fi; + if miny>(-#4-1): + miny:=-#4-1; + fi; + enddef; + toto(#5); + Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy); + pair A,B,C,D,E; + A=(0,0); + B=(minx*unitpx,0); + C=(maxx*unitpx,0); + D=(0,miny*unitpy); + E=(0,maxy*unitpy); + for k=0 upto (maxx-minx): + draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris; + endfor; + for k=0 upto (maxy-miny): + draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris; + endfor; + drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0)); + drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy)); + dotlabel.bot(LATEX("\noexpand\footnotesize\num{"&decimal(#7)&"}"),(unitex,0)); + dotlabel.lft(LATEX("\noexpand\footnotesize\num{"&decimal(#8)&"}"),(0,unitey)); + label.llft(btex 0 etex,A); + % apparition du nom des points ou pas + m_c:=m_c*3; + marque_p:="croix"; + vardef tata(text t)=%on place les points + if #6>0: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if #6>1: + if (k>0) and (l>0): + label.urt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l>0): + label.urt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l=0): + label.urt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l>0): + label.ulft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l<0): + label.llft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l<0): + label.llft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l=0): + label.llft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l<0): + label.lrt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + pointe((k*unitpx,l*unitpy)); + fi; + if (#6=1) or (#6=3): + draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly; + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + vardef Tracage(text t)(text ls)=%on trace les segments + pair A[]; + n:=0;%pour parcourir la liste + m:=0;%pour lister les points par leur nombre + for p_=t: + n:=n+1; + if (n mod 3)=1: + k:=p_; + fi; + if (n mod 3)=2: + l:=p_; + fi; + if (n mod 3)=0: + m:=m+1; + A[m]=(k*unitpx,l*unitpy); + fi; + endfor; + for p_=ls: + draw segment(A[p_ div 10],A[p_ mod 10]); + endfor; + enddef; + tata(#5); + Tracage(#5)(#9); + \end{mpost} + \fi +} + +\def\MPTouteDROITEGraduee#1#2{% + % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires + % #2 : liste des noms des points + \ifluatex + \mplibforcehmode + \begin{mplibcode} + maxx:=0; + minx:=4000; + unitex:=\useKV[ClesReperage]{Unitex}*cm; + pasx:=\useKV[ClesReperage]{Pasx}; + unitp:=unitex/pasx;%unit\'e de d\'eplacement + ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; + ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; + AffichageGrad:=\AffichageGrad; + AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; + AffichageNom:=\AffichageNom; + boolean DemiDroite; + DemiDroite=\useKV[ClesReperage]{DemiDroite}; + numeric valeur[]; + vardef titi(text t)= + n:=0; + for p_=t: + n:=n+1; + valeur[n]=p_; + endfor; + enddef; + titi(#1); + % Détermination des abscisses maximale et minimale + for k=1 upto n: + if valeur[k]>maxx: + maxx:=valeur[k]; + fi; + if valeur[k]<minx: + minx:=valeur[k]; + fi; + endfor; + maxx:=maxx+(pasx div 2); + minx:=minx-(pasx div 2); + if maxx<(pasx+1): + maxx:=2*pasx-1; + fi; + if minx>(-pasx-1): + minx:=-2*pasx-1; + fi; + if minx<\useKV[ClesReperage]{ValeurMin}: + minx:=\useKV[ClesReperage]{ValeurMin}; + fi; + if maxx>\useKV[ClesReperage]{ValeurMax}: + maxx:=\useKV[ClesReperage]{ValeurMax}; + fi; + if DemiDroite: + minx:=0; + fi; + % ----- + pair A,B,C; + A=(0,0); + B=unitp*(maxx,0); + C=unitp*(minx,0); + % On trace la droite + if DemiDroite: + drawarrow C--(B+unitp*(0.75,0)); + else: + drawarrow (C+unitp*(-0.75,0))--(B+unitp*(0.75,0)); + fi; + % marquage secondaire + marque_s:=marque_s/3; +% labeloffset:=labeloffset*2; + if ((maxx-minx) mod 2)=0: + for k=(minx+1) step 2 until (maxx-1): + draw marquedemidroite(C,B); + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + else: + for k=(minx) step 2 until (maxx-1): + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + fi; + % marquage primaire + marque_s:=marque_s*3; + for k=0 step pasx until (maxx-pasx): + draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); + endfor; + for k=0 step -pasx until (minx+pasx): + draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]); + endfor; + % marquage des points + m_c:=m_c*3; + marque_p:="croix"; + labeloffset:=labeloffset*3; + label.bot(TEX("\footnotesize\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0)); + label.bot(TEX("\footnotesize\num{"&decimal(ValeurOrigine)&"}"),A); + if AffichageGrad>0: + for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): + if (k<0) or (k>1): + label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(k,0));%%% + fi; + endfor; + fi; + vardef tata(text t)=%on place les points + if AffichageNom>0: + n:=0; + for p_=t: + n:=n+1; + if substring(1,2) of p_="*": + label.top(TEX(substring(2,length p_) of p_),unitp*(valeur[n],0)); + else: + label.top(TEX(p_),unitp*(valeur[n],0)); + fi; + if p_<>"": + pointe(unitp*(valeur[n],0)); + fi; + endfor; + fi; + % On ajoute une paramétrisation possible à chaque point. + if AffichageCoord>0: + n:=0; + for p_=t: + n:=n+1; + if substring(1,2) of p_="*": + ACoord:=scantokens(substring(0,1) of p_); + if ACoord=3: + drawarrow ((unitp*valeur[n],-7mm))--((unitp*valeur[n],-3mm)); + label.bot(btex \hbox to2em{\dotfill} etex,((unitp*valeur[n],-8mm))); + pointe(unitp*(valeur[n]-ValeurOrigine,0)); + elseif ACoord=2: + if ((ValeurUnitex*valeur[n]) mod pasx)<>0: + label.bot(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); + else: + label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + fi; + pointe(unitp*(valeur[n],0)); + elseif ACoord=1: + label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + pointe(unitp*(valeur[n],0)); + fi; + else: + if AffichageCoord=3: + if p_<>"": + drawarrow ((unitp*valeur[n],-7mm))--((unitp*valeur[n],-3mm)); + label.bot(btex \hbox to2em{\dotfill} etex,((unitp*valeur[n],-8mm))); + pointe(unitp*(valeur[n],0)); + fi; + elseif AffichageCoord=2: + if p_<>"": + if ((ValeurUnitex*valeur[n]) mod pasx)<>0: + label.bot(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); + else: + label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + fi; + pointe(unitp*(valeur[n],0)); + fi; + elseif AffichageCoord=1: + if p_<>"": + label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + pointe(unitp*(valeur[n],0)); + fi; + fi; + fi; + endfor; + fi; + enddef; + %%% + tata(#2); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={unitex:=\useKV[ClesReperage]{Unitex}*cm; pasx:=\useKV[ClesReperage]{Pasx}; unitp:=unitex/pasx; ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; AffichageGrad:=\AffichageGrad; AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; AffichageNom:=\AffichageNom; ValeurMin=\useKV[ClesReperage]{ValeurMin}; ValeurMax=\useKV[ClesReperage]{ValeurMax};boolean DemiDroite;DemiDroite=\useKV[ClesReperage]{DemiDroite}}] + maxx:=0; + minx:=4000; + numeric valeur[]; + vardef titi(text t)= + n:=0; + for p_=t: + n:=n+1; + valeur[n]=p_; + endfor; + enddef; + titi(#1); + % Détermination des abscisses maximale et minimale + for k=1 upto n: + if valeur[k]>maxx: + maxx:=valeur[k]; + fi; + if valeur[k]<minx: + minx:=valeur[k]; + fi; + endfor; + maxx:=maxx+(pasx div 2); + minx:=minx-(pasx div 2); + if maxx<(pasx+1): + maxx:=2*pasx-1; + fi; + if minx>(-pasx-1): + minx:=-2*pasx-1; + fi; + if minx<ValeurMin: + minx:=ValeurMin; + fi; + if maxx>ValeurMax: + maxx:=ValeurMax; + fi; + if DemiDroite: + minx:=0; + fi; + % ----- + pair A,B,C; + A=(0,0); + B=unitp*(maxx,0); + C=unitp*(minx,0); + % On trace la demi-droite + if DemiDroite: + drawarrow C--(B+unitp*(0.75,0)); + else: + drawarrow (C+unitp*(-0.75,0))--(B+unitp*(0.75,0)); + fi; + % marquage secondaire + marque_s:=marque_s/3; + %labeloffset:=labeloffset*2; + if ((maxx-minx) mod 2)=0: + for k=(minx+1) step 2 until (maxx-1): + draw marquedemidroite(C,B); + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + else: + for k=(minx) step 2 until (maxx-1): + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + fi; + % marquage primaire + marque_s:=marque_s*3; + for k=0 step pasx until (maxx-pasx): + draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); + endfor; + for k=0 step -pasx until (minx+pasx): + draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]); + endfor; + % marquage des points + m_c:=m_c*3; + marque_p:="croix"; + labeloffset:=labeloffset*3; + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0)); + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ValeurOrigine)&"}"),A); + if AffichageGrad>0: + for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): + if (k<0) or (k>1): + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(k,0));%%% + fi; + endfor; + fi; + vardef tata(text t)=%on place les points + if AffichageNom>0: + n:=0; + for p_=t: + n:=n+1; + if substring(1,2) of p_="*": + label.top(LATEX(substring(2,length p_) of p_),unitp*(valeur[n],0)); + else: + label.top(LATEX(p_),unitp*(valeur[n],0)); + fi; + if p_<>"": + pointe(unitp*(valeur[n],0)); + fi; + endfor; + fi; + if AffichageCoord>0: + n:=0; + for p_=t: + n:=n+1; + if substring(1,2) of p_="*": + ACoord:=scantokens(substring(0,1) of p_); + if ACoord=3: + drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3)); + label.bot(btex \noexpand\hbox to2em{\noexpand\dotfill} etex,(unitp*(valeur[n],-1))); + pointe(unitp*(valeur[n]-ValeurOrigine,0)); + elseif ACoord=2: + if ((ValeurUnitex*valeur[n]) mod pasx)<>0: + label.bot(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\noexpand\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); + else: + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + fi; + pointe(unitp*(valeur[n],0)); + elseif ACoord=1: + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + pointe(unitp*(valeur[n],0)); + fi; + else: + if AffichageCoord=3: + if p_<>"": + drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3)); + label.bot(btex \noexpand\hbox to2em{\noexpand\dotfill} etex,(unitp*(valeur[n],-1))); + pointe(unitp*(valeur[n],0)); + fi; + elseif AffichageCoord=2: + if p_<>"": + if ((ValeurUnitex*valeur[n]) mod pasx)<>0: + label.bot(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\noexpand\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); + else: + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + fi; + pointe(unitp*(valeur[n],0)); + fi; + elseif AffichageCoord=1: + if p_<>"": + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + pointe(unitp*(valeur[n],0)); + fi; + fi; + fi; + endfor; + fi; + enddef; + %%% + tata(#2); + \end{mpost} + \fi +}% + +\def\MPThermo#1#2{% + % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires + % #2 : liste des noms des points + \ifluatex + \mplibforcehmode + \begin{mplibcode} + maxx:=0; + minx:=4000; + unitex:=\useKV[ClesReperage]{Unitex}*cm; + pasx:=\useKV[ClesReperage]{Pasx}; + unitp:=unitex/pasx;%unit\'e de d\'eplacement + ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; + ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; + AffichageGrad:=\AffichageGrad; + AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; + AffichageNom:=\AffichageNom; + boolean Kelvin,Farenheit; + Kelvin=\useKV[ClesReperage]{Kelvin}; + Farenheit=\useKV[ClesReperage]{Farenheit}; + color ColMercure; + ColMercure:=\useKV[ClesReperage]{CouleurMercure}; + boolean Mercure; + Mercure=\useKV[ClesReperage]{Mercure}; + numeric valeur[]; + vardef titi(text t)= + n:=0; + for p_=t: + n:=n+1; + valeur[n]=p_; + endfor; + enddef; + titi(#1); + % Détermination des abscisses maximale et minimale + for k=1 upto n: + if valeur[k]>maxx: + maxx:=valeur[k]; + fi; + if valeur[k]<minx: + minx:=valeur[k]; + fi; + endfor; + maxx:=maxx+(pasx div 2); + minx:=minx-(pasx div 2); + if maxx<(pasx+1): + maxx:=2*pasx-1; + fi; + if minx>(-pasx-1): + minx:=-2*pasx-1; + fi; + if Kelvin: + minx:=0; + fi; + % ----- + pair A,B,C; + A=(0,0); + B=unitp*(0,maxx); + C=unitp*(0,minx); + % On trace la demi-droite + draw ((C+unitp*(0,-0.75))--(B+unitp*(0,0.75))); + % marquage secondaire + marque_s:=marque_s/3; + if pasx<11: + labeloffset:=labeloffset*2; + if ((maxx-minx) mod 2)=0: + for k=(minx+1) step 2 until (maxx-1): + draw marquedemidroite(C,B); + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + else: + for k=(minx) step 2 until (maxx-1): + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + fi; + fi; + % marquage primaire + marque_s:=marque_s*3; + for k=0 step pasx until (maxx-pasx): + draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); + endfor; + for k=0 step -pasx until (minx+pasx): + draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]); + endfor; + % marquage des points + m_c:=m_c*3; + marque_p:="croix"; + labeloffset:=labeloffset*2; + if Kelvin: + label.lft(TEX("\footnotesize\Temp[K]{"&decimal(ValeurUnitex)&"}"),unitex*(0,1)); + label.lft(TEX("\footnotesize\Temp[K]{"&decimal(ValeurOrigine)&"}"),A); + elseif Farenheit: + label.lft(TEX("\footnotesize\Temp[F]{"&decimal(ValeurUnitex)&"}"),unitex*(0,1)); + label.lft(TEX("\footnotesize\Temp[F]{"&decimal(ValeurOrigine)&"}"),A); + else: + label.lft(TEX("\footnotesize\Temp{"&decimal(ValeurUnitex)&"}"),unitex*(0,1)); + label.lft(TEX("\footnotesize\Temp{"&decimal(ValeurOrigine)&"}"),A); + fi; + if AffichageGrad>0: + for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): + if (k<0) or (k>1): + if Kelvin: + label.lft(TEX("\footnotesize\Temp[K]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(0,k));%%% + elseif Farenheit: + label.lft(TEX("\footnotesize\Temp[F]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(0,k));%%% + else: + label.lft(TEX("\footnotesize\Temp{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(0,k));%%% + fi; + fi; + endfor; + fi; + + vardef Thermo(expr nbt)= + pair Tc[]; + Tc[0]=(5mm,unitp*(minx-1)); + path cc[]; + cc1=cercles(Tc[0],2.5mm); + Tc1=pointarc(cc1,75); + Tc4=pointarc(cc1,105); + Tc2=(xpart(Tc1),ypart(B+unitp*(0,0.75))); + Tc3=(xpart(Tc4),ypart(B+unitp*(0,0.75))); + Tc5=(xpart(Tc1),ypart(unitp*(0,valeur[1]))); + Tc6=(xpart(Tc4),ypart(unitp*(0,valeur[1]))); + path temp; + temp=Tc1--Tc5--Tc6--Tc4--arccercle(Tc4,Tc1,Tc0)--cycle; + if nbt>0: + fill temp withcolor ColMercure; + trace Tc5--Tc6; + fi; + trace arccercle(Tc4,Tc1,Tc0); + trace Tc1--Tc2--arccercle(Tc2,Tc3,iso(Tc2,Tc3))--Tc4; + enddef; + + if Mercure:Thermo(1) else : Thermo(0) fi; + + vardef tata(text t)=%on place les points + if AffichageNom>0: + n:=0; + for p_=t: + n:=n+1; + label.rt(TEX(p_),unitp*(0,valeur[n])); + if p_<>"": + pointe(unitp*(0,valeur[n])); + fi; + endfor; + fi; + if AffichageCoord=3: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + drawarrow (unitp*(-1,valeur[n]))--(unitp*(-0.3,valeur[n])); + label.rt(btex \hbox to2em{\dotfill} etex,(unitp*(-1,valeur[n]))); + pointe(unitp*(0,valeur[n]-ValeurOrigine)); + fi; + endfor; + elseif AffichageCoord=2: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + if ((ValeurUnitex*valeur[n]) mod pasx)<>0: + label.rt(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(0,valeur[n])); + else: + label.rt(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(0,valeur[n])); + fi; + pointe(unitp*(0,valeur[n]-ValeurOrigine)); + fi; + endfor; + elseif AffichageCoord=1: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + if Kelvin: + label.rt(TEX("\footnotesize\Temp[K]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),(5mm,unitp*valeur[n])); + elseif Farenheit: + label.rt(TEX("\footnotesize\Temp[F]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),(5mm,unitp*valeur[n])); + else: + label.rt(TEX("\footnotesize\Temp{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),(5mm,unitp*valeur[n])); + fi; + pointe(unitp*(0,valeur[n])); + draw (unitp*(0,valeur[n]))--(7.5mm,unitp*valeur[n]) dashed evenly; + fi; + endfor; + fi; + enddef; + %%% + tata(#2); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={unitex:=\useKV[ClesReperage]{Unitex}*cm; + pasx:=\useKV[ClesReperage]{Pasx}; + unitp:=unitex/pasx;%unit\'e de d\'eplacement + ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; + ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; + AffichageGrad:=\AffichageGrad; + AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; + AffichageNom:=\AffichageNom; + boolean Kelvin,Farenheit; + Kelvin=\useKV[ClesReperage]{Kelvin}; + Farenheit=\useKV[ClesReperage]{Farenheit}; + color ColMercure; + ColMercure:=\useKV[ClesReperage]{CouleurMercure}; + boolean Mercure; + Mercure=\useKV[ClesReperage]{Mercure};}] + maxx:=0; + minx:=4000; + numeric valeur[]; + vardef titi(text t)= + n:=0; + for p_=t: + n:=n+1; + valeur[n]=p_; + endfor; + enddef; + titi(#1); + % Détermination des abscisses maximale et minimale + for k=1 upto n: + if valeur[k]>maxx: + maxx:=valeur[k]; + fi; + if valeur[k]<minx: + minx:=valeur[k]; + fi; + endfor; + maxx:=maxx+(pasx div 2); + minx:=minx-(pasx div 2); + if maxx<(pasx+1): + maxx:=2*pasx-1; + fi; + if minx>(-pasx-1): + minx:=-2*pasx-1; + fi; + if Kelvin: + minx:=0; + fi; + % ----- + pair A,B,C; + A=(0,0); + B=unitp*(0,maxx); + C=unitp*(0,minx); + % On trace la demi-droite + draw (C+unitp*(0,-0.75))--(B+unitp*(0,0.75)); + % marquage secondaire + marque_s:=marque_s/3; + if pasx<11: + labeloffset:=labeloffset*2; + if ((maxx-minx) mod 2)=0: + for k=(minx+1) step 2 until (maxx-1): + draw marquedemidroite(C,B); + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + else: + for k=(minx) step 2 until (maxx-1): + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + fi; + fi; + % marquage primaire + marque_s:=marque_s*3; + for k=0 step pasx until (maxx-pasx): + draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); + endfor; + for k=0 step -pasx until (minx+pasx): + draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]); + endfor; + % marquage des points + m_c:=m_c*3; + marque_p:="croix"; + labeloffset:=labeloffset*2; + if Kelvin: + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurUnitex)&"}{\kelvin}"),unitex*(0,1)); + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurOrigine)&"}{\kelvin}"),A); + elseif Farenheit: + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurUnitex)&"}{\farenheit}"),unitex*(0,1)); + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurOrigine)&"}{\farenheit}"),A); + else: + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurUnitex)&"}{\celsius}"),unitex*(0,1)); + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurOrigine)&"}{\celsius}"),A); + fi; + if AffichageGrad>0: + for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): + if (k<0) or (k>1): + if Kelvin: + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}{\kelvin}"),unitex*(0,k));%%% + elseif Farenheit: +label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}{\farenheit}"),unitex*(0,k));%%% + else: +label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}{\celsius}"),unitex*(0,k));%%% + fi; + fi; + endfor; + fi; + + vardef Thermo(expr nbt)= + pair Tc[]; + Tc[0]=(5mm,unitp*(minx-1)); + path cc[]; + cc1=cercles(Tc[0],2.5mm); + Tc1=pointarc(cc1,75); + Tc4=pointarc(cc1,105); + Tc2=(xpart(Tc1),ypart(B+unitp*(0,0.75))); + Tc3=(xpart(Tc4),ypart(B+unitp*(0,0.75))); + Tc5=(xpart(Tc1),ypart(unitp*(0,valeur[1]))); + Tc6=(xpart(Tc4),ypart(unitp*(0,valeur[1]))); + path temp; + temp=Tc1--Tc5--Tc6--Tc4--arccercle(Tc4,Tc1,Tc0)--cycle; + if nbt>0: + fill temp withcolor ColMercure; + trace Tc5--Tc6; + fi; + trace arccercle(Tc4,Tc1,Tc0); + trace Tc1--Tc2--arccercle(Tc2,Tc3,iso(Tc2,Tc3))--Tc4; + enddef; + + if Mercure:Thermo(1) else : Thermo(0) fi; + + vardef tata(text t)=%on place les points + if AffichageNom>0: + n:=0; + for p_=t: + n:=n+1; + label.rt(LATEX(p_),unitp*(0,valeur[n])); + if p_<>"": + pointe(unitp*(0,valeur[n])); + fi; + endfor; + fi; + if AffichageCoord=3: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + drawarrow (unitp*(-1,valeur[n]))--(unitp*(-0.3,valeur[n])); + label.rt(\btex \hbox to2em{\dotfill} etex,(unitp*(-1,valeur[n]))); + pointe(unitp*(0,valeur[n]-ValeurOrigine)); + fi; + endfor; + elseif AffichageCoord=2: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + if ((ValeurUnitex*valeur[n]) mod pasx)<>0: + label.rt(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(0,valeur[n])); + else: + label.rt(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(0,valeur[n])); + fi; + pointe(unitp*(0,valeur[n]-ValeurOrigine)); + fi; + endfor; + elseif AffichageCoord=1: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + if Kelvin: + label.rt(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}{\kelvin}"),(5mm,unitp*valeur[n])); + elseif Farenheit: + label.rt(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}{\farenheit}"),(5mm,unitp*valeur[n])); + else: + label.rt(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}{\celsius}"),(5mm,unitp*valeur[n])); + fi; + pointe(unitp*(0,valeur[n])); + draw (unitp*(0,valeur[n]))--(7.5mm,unitp*valeur[n]) dashed evenly; + fi; + endfor; + fi; + enddef; + %%% + tata(#2); + \end{mpost} + \fi +} + +\def\MPNewDROITEGradueeMulti#1#2{% + % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires + % #2 : liste des noms des points + \ifluatex + \mplibforcehmode + \begin{mplibcode} + maxx:=0; + minx:=4000; + unitex:=\useKV[ClesReperage]{Unitex}*cm; + pasx:=\useKV[ClesReperage]{Pasx}; + unitp:=unitex/pasx;%unit\'e de d\'eplacement + ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; + ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; + AffichageGrad:=\AffichageGrad; + AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; + AffichageNom:=\AffichageNom; + numeric valeur[]; + vardef titi(text t)= + n:=0; + for p_=t: + n:=n+1; + valeur[n]=p_; + endfor; + enddef; + titi(#1); + % Détermination des abscisses maximale et minimale + for k=1 upto n: + if valeur[k]>maxx: + maxx:=valeur[k]; + fi; + if valeur[k]<minx: + minx:=valeur[k]; + fi; + endfor; + maxx:=maxx+(pasx div 2); + minx:=minx-(pasx div 2); + if maxx<(pasx+1): + maxx:=2*pasx-1; + fi; + if minx>(-pasx-1): + minx:=-2*pasx-1; + fi; + if minx<\useKV[ClesReperage]{ValeurMin}: + minx:=\useKV[ClesReperage]{ValeurMin}; + fi; + if maxx>\useKV[ClesReperage]{ValeurMax}: + maxx:=\useKV[ClesReperage]{ValeurMax}; + fi; +% % ----- + pair A[],B[],C[]; + for l=0 upto (\useKV[ClesReperage]{Etages}-1): + A[l]=(0,-l*cm); + B[l]=unitp*(maxx,0)+(0,-l*cm); + C[l]=unitp*(minx,0)+(0,-l*cm); + % On trace la demi-droite + drawarrow (C[l]+unitp*(-0.75,0))--(B[l]+unitp*(0.75,0)); + % marquage secondaire + marque_s:=marque_s/3; + if ((maxx-minx) mod 2)=0: + for k=(minx+1) step 2 until (maxx-1): + draw marquedemidroite(C[l],B[l]); + draw marquesegment((k/maxx)[A[l],B[l]],((k+1)/maxx)[A[l],B[l]]); + endfor; + else: + for k=(minx) step 2 until (maxx-1): + draw marquesegment((k/maxx)[A[l],B[l]],((k+1)/maxx)[A[l],B[l]]); + endfor; + fi; + % marquage primaire + marque_s:=marque_s*3; + for k=0 step pasx until (maxx-pasx): + draw marquesegment((k/maxx)[A[l],B[l]],((k+pasx)/maxx)[A[l],B[l]]); + endfor; + for k=0 step -pasx until (minx+pasx): + draw marquesegment((k/maxx)[A[l],B[l]],((k-pasx)/maxx)[A[l],B[l]]); + endfor; + endfor; + % On trace les zoom + for k=0 upto (\useKV[ClesReperage]{Etages}-2): + lp:=floor(1+uniformdeviate(8)); + draw (lp/10)[A[k],B[k]]--A[k+1] dashed evenly scaled 0.5 withcolor 0.5white; + draw ((lp+1)/10)[A[k],B[k]]--B[k+1] dashed evenly scaled 0.5 withcolor 0.5white; + endfor; + % Labelisation + m_c:=m_c*3; + marque_p:="croix"; + labeloffset:=labeloffset*2; + label.top(TEX("\footnotesize\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0)); + label.top(TEX("\footnotesize\num{"&decimal(ValeurOrigine)&"}"),A[0]); + if AffichageGrad>0: + for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): + if (k<0) or (k>1): + label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(k,0));%%% + fi; + endfor; + fi; + labeloffset:=labeloffset/2; + vardef tata(text t)=%on place les points + if AffichageNom>0: + n:=0; + for p_=t: + n:=n+1; + label.top(TEX(p_),unitp*(valeur[n],0)+(0,(-\useKV[ClesReperage]{Etages}+1)*cm)); + pointe(unitp*(valeur[n],0)); + endfor; + fi; + if AffichageCoord=3: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + drawarrow (unitp*(valeur[n],-1)+(0,(-\useKV[ClesReperage]{Etages}+1)*cm))--(unitp*(valeur[n],-0.3)+(0,(-\useKV[ClesReperage]{Etages}+1)*cm)); + label.bot(btex \hbox to4em{\dotfill} etex,(unitp*(valeur[n],-1))+(0,(-\useKV[ClesReperage]{Etages}+0.5)*cm)); + %pointe(unitp*(valeur[n],0)); + fi; + endfor; + fi; + enddef; + %%% + tata(#2); + \end{mplibcode} + \fi +} + +% Pour construire les droite/demi-droite gradu\'ee +\def\builddemidroitenew{% + \toklistepointdroite{}% + \toklistenompointdemidroite{}% + \xdef\AffichageNom{0}\ifboolKV[ClesReperage]{AffichageNom}{\xdef\AffichageNom{1}}{} + \xdef\AffichageCoord{\useKV[ClesReperage]{AffichageAbs}} + \xdef\AffichageGrad{0}\ifboolKV[ClesReperage]{AffichageGrad}{\xdef\AffichageGrad{1}}{} + \ifboolKV[ClesReperage]{Thermometre}{% + \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}% + \xdef\Listedesvaleursaplacersurlademidroite{}% + \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}% + % \Listedesvaleursaplacersurlademidroite% + \MPThermo{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}% + }{% + \xdef\Listedesvaleursaplacersurlademidroite{}% + \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}% + \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}% + \MPTouteDROITEGraduee{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}% + }% +}% + +\NewDocumentCommand\Reperage{o m}{% + \useKVdefault[ClesReperage]% + \setKV[ClesReperage]{#1}% + \ifboolKV[ClesReperage]{Espace}{% + \setKV[ClesReperage]{Unitex=2,Unitey=2.5,Unitez=1.5}% + \ifboolKV[ClesReperage]{Sphere}{\setKV[ClesReperage]{EchelleEspace=75}}{}% + \setKV[ClesReperage]{#1}% + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListePointEspace{#2}% + \buildespace% + }{\ifboolKV[ClesReperage]{Plan}{% + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListePointRepere{#2}% + \buildreperenew% + }{% + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListePointDroite{#2}% + \builddemidroitenew% + }% + }% +}% + +\NewDocumentCommand\ReperageMulti{o m}{% + \useKVdefault[ClesReperage]% + \setKV[ClesReperage]{#1}% + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListePointDroite{#2}% + \toklistepointdroite{}% + \toklistenompointdemidroite{}% + \xdef\AffichageNom{0}\ifboolKV[ClesReperage]{AffichageNom}{\xdef\AffichageNom{1}}{} + \xdef\AffichageCoord{\useKV[ClesReperage]{AffichageAbs}} + \xdef\AffichageGrad{0}\ifboolKV[ClesReperage]{AffichageGrad}{\xdef\AffichageGrad{1}}{} + \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}% + \xdef\Listedesvaleursaplacersurlademidroite{}% + \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}% + \MPNewDROITEGradueeMulti{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}% + \setsepchar{,}% +}%
\ No newline at end of file |