diff options
Diffstat (limited to 'macros/latex/contrib/profcollege/latex/PfCCalisson.tex')
-rw-r--r-- | macros/latex/contrib/profcollege/latex/PfCCalisson.tex | 361 |
1 files changed, 361 insertions, 0 deletions
diff --git a/macros/latex/contrib/profcollege/latex/PfCCalisson.tex b/macros/latex/contrib/profcollege/latex/PfCCalisson.tex new file mode 100644 index 0000000000..08834c7311 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCCalisson.tex @@ -0,0 +1,361 @@ +%%% +% Calisson +%%% +\setKVdefault[Calisson]{Taille=3,Solution=false,Rayon=5cm,Couleur=red}% + +\def\UpdatetoksCalissong#1\nil{\addtotok\tokcalissonlistetracesg{,"#1"}}% +\def\UpdatetoksCalissongDepart#1\nil{\addtotok\tokcalissonlistetracesg{"#1"}}% +\def\UpdatetoksCalissond#1\nil{\addtotok\tokcalissonlistetracesd{,"#1"}}% +\def\UpdatetoksCalissondDepart#1\nil{\addtotok\tokcalissonlistetracesd{"#1"}}% + +\newtoks\tokcalissonlistetracesg +\newtoks\tokcalissonlistetracesd + +\NewDocumentCommand\Calisson{o m}{% + \useKVdefault[Calisson]% + \setKV[Calisson]{#1}% + % Essai de cassage du code + \tokcalissonlistetracesg{}% + \tokcalissonlistetracesd{}% + %Partie Gauche -> ok + \StrLeft{0#2}{2}[\Depart]% + \StrGobbleLeft{0#2}{2}[\Reste]% + \expandafter\UpdatetoksCalissongDepart\Depart0\nil% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% + \StrLeft{0\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissong\Depart\nil% + \StrGobbleLeft{0\Reste}{3}[\Reste]% + }% + \StrLeft{00\Reste}{3}[\Depart]% + \StrGobbleLeft{00\Reste}{3}[\Reste]% + \expandafter\UpdatetoksCalissong\Depart\nil% + % fin premiere ligne + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% + \StrLeft{\Reste}{2}[\Depart]% + \expandafter\UpdatetoksCalissong\Depart0\nil% + \StrGobbleLeft{\Reste}{2}[\Reste]% + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% + \StrLeft{\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissong\Depart\nil% + \StrGobbleLeft{\Reste}{3}[\Reste]% + }% + \StrLeft{00\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissong\Depart\nil% + \StrGobbleLeft{00\Reste}{3}[\Reste]% + }% + % fin des lignes intermédiaires + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}}}}\do{% + \StrLeft{\Reste}{2}[\Depart]% + \expandafter\UpdatetoksCalissong\Depart0\nil% + \StrGobbleLeft{\Reste}{2}[\Reste] + \xintifboolexpr{##1>\fpeval{\useKV[Calisson]{Taille}-1}}{}{% + \xintFor* ##2 in {\xintSeq{\fpeval{\useKV[Calisson]{Taille}-##1}}{1}}\do{% + \StrLeft{\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissong\Depart\nil% + \StrGobbleLeft{\Reste}{3}[\Reste]% + }% + }% + }% + %Liste gauche : \the\tokcalissonlistetracesg% + % Partie droite + \StrLeft{0\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissondDepart\Depart\nil% + \StrGobbleLeft{0\Reste}{3}[\Reste]% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-2}}}\do{% + \StrLeft{0\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissond\Depart\nil% + \StrGobbleLeft{0\Reste}{3}[\Reste]% + }% + \StrLeft{00\Reste}{3}[\Depart]% + \StrGobbleLeft{00\Reste}{3}[\Reste]% + \expandafter\UpdatetoksCalissond\Depart\nil% +% fin premiere ligne + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% + \StrLeft{\Reste}{1}[\Depart]% + \expandafter\UpdatetoksCalissond\Depart00\nil% + \StrGobbleLeft{\Reste}{1}[\Reste]% + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% + \StrLeft{\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissond\Depart\nil% + \StrGobbleLeft{\Reste}{3}[\Reste]% + }% + \StrLeft{00\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissond\Depart\nil% + \StrGobbleLeft{00\Reste}{3}[\Reste]% + }% + %% fin des lignes intermédiaires + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}}}}\do{% + \StrLeft{\Reste}{1}[\Depart]% + \expandafter\UpdatetoksCalissond\Depart00\nil% + \StrGobbleLeft{\Reste}{1}[\Reste]% + \xintifboolexpr{##1>\fpeval{\useKV[Calisson]{Taille}-1}}{}{% + \xintFor* ##2 in {\xintSeq{\fpeval{\useKV[Calisson]{Taille}-##1}}{1}}\do{% + \StrLeft{\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissond\Depart\nil% + \StrGobbleLeft{\Reste}{3}[\Reste]% + }% + }% + }% +% \par Liste droite :\the\tokcalissonlistetracesd + \BuildCalisson{\the\tokcalissonlistetracesg}{\the\tokcalissonlistetracesd}% +}% + +\NewDocumentCommand\BuildCalisson{m m}{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean Solution; + Solution:=\useKV[Calisson]{Solution}; + + color CouleurSolution; + CouleurSolution:=\useKV[Calisson]{Couleur}; + + Rayon=\useKV[Calisson]{Rayon}; + Taille=\useKV[Calisson]{Taille}; + + pair A,B,C,D,E,F,O; + O=(0,0); + path cc; + cc=cercles(O,Rayon); + D=pointarc(cc,30); + E=pointarc(cc,90); + F=pointarc(cc,150); + A=pointarc(cc,210); + B=pointarc(cc,270); + C=pointarc(cc,330); + trace polygone(A,B,C,D,E,F) withpen pencircle scaled 2; + path Gauche,Droit,Haut,Bas,TopGauche,BasDroit; + Gauche=F--A--B; + Droit=E--D--C; + Haut=F--E--D; + Bas=A--B--C; + TopGauche=E--F--A; + BasDroit=D--C--B; + for k=1 upto 2*Taille-1: + trace (point(k*length Gauche/(2*Taille)) of Gauche)--(point(k*length Droit/(2*Taille)) of Droit) dashed evenly; + trace (point(k*length Haut/(2*Taille)) of Haut)--(point(k*length Bas/(2*Taille)) of Bas) dashed evenly; + trace (point(k*length TopGauche/(2*Taille)) of TopGauche)--(point(k*length BasDroit/(2*Taille)) of BasDroit) dashed evenly; + endfor; + + pair Hor,Ver,Horn; + Hor=(1/Taille)[E,F]; + Ver=rotation(Hor,E,60); + Horn=rotation(Hor,E,120); + + % On positionne les points + pair M[]; + n=0; + %Partie Gauche -> ok + for k=0 upto Taille-1: + for l=0 upto Taille: + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Hor-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + for k=Taille upto 2*Taille-1: + for l=0 upto (2*Taille-1-k): + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Hor-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + % Partie Droite -> ok + for k=1 upto Taille: + n:=n+1; + M[n]=E+k*(Horn-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + for k=1 upto Taille-1: + for l=0 upto Taille: + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Horn-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + for k=Taille upto 2*Taille-1: + for l=0 upto (2*Taille-1-k): + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Horn-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + % + + string Retiens; + Retiens=""; + + pair Depla; + Depla:=Hor; + + vardef LesTracesg(text t)= + n:=0; + for p_=t: + n:=n+1; + for d=1 upto 3: + Retiens:=substring(d-1,d) of p_; + if d=1:Depla:=Hor + elseif d=2:Depla:=Ver + else : Depla:=Horn + fi; + if (Retiens="0") or (Retiens="f"): + elseif Retiens="t": + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2; + elseif Retiens="s": + if Solution: + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2 withcolor CouleurSolution; + fi; + fi; + endfor; + endfor; + enddef; + + vardef LesTracesd(text t)= + for p_=t: + n:=n+1; + for d=1 upto 3: + Retiens:=substring(d-1,d) of p_; + if d=1:Depla:=Horn + elseif d=2:Depla:=Ver + else : Depla:=Hor + fi; + if (Retiens="0") or (Retiens="f"): + elseif Retiens="t": + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2; + elseif Retiens="s": + if Solution: + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2 withcolor CouleurSolution; + fi; + fi; + endfor; + endfor; + enddef; + + LesTracesg(#1); + LesTracesd(#2); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={boolean Solution; Solution:=\useKV[Calisson]{Solution}; Rayon=\useKV[Calisson]{Rayon};Taille=\useKV[Calisson]{Taille};color CouleurSolution; CouleurSolution:=\useKV[Calisson]{Couleur};}] + pair A,B,C,D,E,F,O; + O=(0,0); + path cc; + cc=cercles(O,Rayon); + D=pointarc(cc,30); + E=pointarc(cc,90); + F=pointarc(cc,150); + A=pointarc(cc,210); + B=pointarc(cc,270); + C=pointarc(cc,330); + trace polygone(A,B,C,D,E,F) withpen pencircle scaled 2; + path Gauche,Droit,Haut,Bas,TopGauche,BasDroit; + Gauche=F--A--B; + Droit=E--D--C; + Haut=F--E--D; + Bas=A--B--C; + TopGauche=E--F--A; + BasDroit=D--C--B; + for k=1 upto 2*Taille-1: + trace (point(k*length Gauche/(2*Taille)) of Gauche)--(point(k*length Droit/(2*Taille)) of Droit) dashed evenly; + trace (point(k*length Haut/(2*Taille)) of Haut)--(point(k*length Bas/(2*Taille)) of Bas) dashed evenly; + trace (point(k*length TopGauche/(2*Taille)) of TopGauche)--(point(k*length BasDroit/(2*Taille)) of BasDroit) dashed evenly; + endfor; + + pair Hor,Ver,Horn; + Hor=(1/Taille)[E,F]; + Ver=rotation(Hor,E,60); + Horn=rotation(Hor,E,120); + + % On positionne les points + pair M[]; + n=0; + %Partie Gauche -> ok + for k=0 upto Taille-1: + for l=0 upto Taille: + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Hor-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + for k=Taille upto 2*Taille-1: + for l=0 upto (2*Taille-1-k): + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Hor-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + % Partie Droite -> ok + for k=1 upto Taille: + n:=n+1; + M[n]=E+k*(Horn-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + for k=1 upto Taille-1: + for l=0 upto Taille: + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Horn-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + for k=Taille upto 2*Taille-1: + for l=0 upto (2*Taille-1-k): + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Horn-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + % + + string Retiens; + Retiens=""; + + pair Depla; + Depla:=Hor; + + vardef LesTracesg(text t)= + n:=0; + for p_=t: + n:=n+1; + for d=1 upto 3: + Retiens:=substring(d-1,d) of p_; + if d=1:Depla:=Hor + elseif d=2:Depla:=Ver + else : Depla:=Horn + fi; + if (Retiens="0") or (Retiens="f"): + elseif Retiens="t": + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2; + elseif Retiens="s": + if Solution: + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2 withcolor CouleurSolution; + fi; + fi; + endfor; + endfor; + enddef; + + vardef LesTracesd(text t)= + for p_=t: + n:=n+1; + for d=1 upto 3: + Retiens:=substring(d-1,d) of p_; + if d=1:Depla:=Horn + elseif d=2:Depla:=Ver + else : Depla:=Hor + fi; + if (Retiens="0") or (Retiens="f"): + elseif Retiens="t": + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2; + elseif Retiens="s": + if Solution: + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2 withcolor CouleurSolution; + fi; + fi; + endfor; + endfor; + enddef; + + LesTracesg(#1); + LesTracesd(#2); + \end{mpost} + \fi +}%
\ No newline at end of file |