summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/profcollege/latex/PfCBillard.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/profcollege/latex/PfCBillard.tex')
-rw-r--r--macros/latex/contrib/profcollege/latex/PfCBillard.tex259
1 files changed, 259 insertions, 0 deletions
diff --git a/macros/latex/contrib/profcollege/latex/PfCBillard.tex b/macros/latex/contrib/profcollege/latex/PfCBillard.tex
new file mode 100644
index 0000000000..1dcde0e4c4
--- /dev/null
+++ b/macros/latex/contrib/profcollege/latex/PfCBillard.tex
@@ -0,0 +1,259 @@
+%%%
+% Billard
+%%%
+\setKVdefault[ClesBillard]{Longueur=8cm,Largeur=5cm,Solution=false,Angle=70,Depart=0.5,Vrai=false}
+
+\NewDocumentCommand\Billard{o m}{%
+ \useKVdefault[ClesBillard]%
+ \setKV[ClesBillard]{#1}%
+ \ifboolKV[ClesBillard]{Solution}{%
+ \MPBillardSolution{#2}{\useKV[ClesBillard]{Depart}}{\useKV[ClesBillard]{Angle}}%
+ }{%
+ \MPBillard{#2}{\useKV[ClesBillard]{Depart}}{\useKV[ClesBillard]{Angle}}%
+ }%
+}%
+
+\def\MPBillard#1#2#3{%
+ \mplibcodeinherit{disable}%
+ \begin{Geometrie}[CoinHD={(\useKV[ClesBillard]{Longueur}+2cm,\useKV[ClesBillard]{Largeur}+3cm)}]
+ boolean Vrai;
+ Vrai:=\useKV[ClesBillard]{Vrai};
+ % On définit la liste des 25 lettres alphabétiques dans laquelle on choisit autant de lettres que la longueur du mot
+ % On a retiré la lettre Q pour des questions d'alignements esthétiques.
+ vardef ChoixLettre=
+ save Lettre,choixalea;
+ string Lettre;
+ choixalea=floor(uniformdeviate(26)+1);
+ if choixalea=1:
+ Lettre="A";
+ elseif choixalea=2:
+ Lettre="B";
+ elseif choixalea=3:
+ Lettre="C";
+ elseif choixalea=4:
+ Lettre="D";
+ elseif choixalea=5:
+ Lettre="E";
+ elseif choixalea=6:
+ Lettre="F";
+ elseif choixalea=7:
+ Lettre="G";
+ elseif choixalea=8:
+ Lettre="H";
+ elseif choixalea=9:
+ Lettre="I";
+ elseif choixalea=10:
+ Lettre="J";
+ elseif choixalea=11:
+ Lettre="K";
+ elseif choixalea=12:
+ Lettre="L";
+ elseif choixalea=13:
+ Lettre="M";
+ elseif choixalea=14:
+ Lettre="N";
+ elseif choixalea=15:
+ Lettre="O";
+ elseif choixalea=16:
+ Lettre="P";
+ elseif choixalea=17:
+ Lettre="O";
+ elseif choixalea=18:
+ Lettre="R";
+ elseif choixalea=19:
+ Lettre="S";
+ elseif choixalea=20:
+ Lettre="T";
+ elseif choixalea=21:
+ Lettre="U";
+ elseif choixalea=22:
+ Lettre="V";
+ elseif choixalea=23:
+ Lettre="W";
+ elseif choixalea=24:
+ Lettre="X";
+ elseif choixalea=25:
+ Lettre="Y";
+ elseif choixalea=26:
+ Lettre="Z";
+ fi;
+ Lettre
+ enddef;
+ % On crée un Quick Sort
+ def QS(expr ndeb,nfin)=
+ begingroup
+ save v,m,x;
+ if ndeb<nfin:
+ v:=l[cpt[ndeb]];
+ m:=ndeb;
+ for i=(ndeb+1) upto nfin:
+ if l[cpt[i]]<v:
+ m:=m+1;
+ x:=cpt[m];cpt[m]:=cpt[i];cpt[i]:=x;
+ fi
+ endfor;
+ x:=cpt[m];cpt[m]:=cpt[ndeb];cpt[ndeb]:=x;
+ QS(ndeb,m-1);
+ QS(m+1,nfin);
+ fi
+ endgroup
+ enddef;
+ % On définit le rectangle
+ pair M[],Co,Intermed;
+ M1=u*(1,2);
+ M2-M1=(\useKV[ClesBillard]{Longueur},0);
+ M3-M2=(0,\useKV[ClesBillard]{Largeur});
+ M4-M3=M1-M2;
+ Co=iso(M1,M3);
+ path rec,cote[];
+ rec=polygone(M1,M2,M3,M4);
+ cote1=segment(M1,M2);
+ cote2=segment(M2,M3);
+ cote3=segment(M3,M4);
+ cote4=segment(M4,M1);
+ trace rec;
+ pair Pt[],FauxPt[];
+ nbfaux=0;
+ l1=#2;
+ Pt[1]=point(l1) of rec;
+ angleref=#3;
+ if l1>3:
+ angledepart=90+angleref;
+ Pt[2]=demidroite(Pt[1],rotation(M1,Pt1,angledepart)) intersectionpoint (subpath(0,3) of rec);
+ dotlabel.lft(TEX(substring(0,1) of #1),Pt[1]);
+ elseif l1>2:
+ angledepart=180+angleref;
+ Pt[2]=demidroite(Pt[1],rotation(M4,Pt1,angledepart)) intersectionpoint ((subpath(3,4) of rec)--(subpath(0,2) of rec));
+ dotlabel.top(TEX(substring(0,1) of #1),Pt[1]);
+ elseif l1>1:
+ angledepart=angleref-90;
+ Pt[2]=demidroite(Pt[1],rotation(M3,Pt1,angledepart)) intersectionpoint ((subpath(2,4) of rec)--(subpath(0,1) of rec));
+ dotlabel.rt(TEX(substring(0,1) of #1),Pt[1]);
+ else:
+ angledepart=angleref;
+ Pt[2]=demidroite(Pt[1],rotation(M2,Pt1,angledepart)) intersectionpoint (subpath(1,4) of rec);
+ dotlabel.bot(TEX(substring(0,1) of #1),Pt[1]);
+ fi;
+ tourne=90;
+ numeric Blong;
+ BLong:=length #1;
+ % Détermination des points.
+ if Vrai:
+ for k=3 upto BLong:
+ Intermed:=symetrie(Pt[k-2],Pt[k-1],Pt[k-1]+M2-M3);
+ if (demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectiontimes rec)<>(-1,-1):
+ Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec;
+ else:
+ Intermed:=symetrie(Pt[k-2],Pt[k-1],Pt[k-1]+M1-M2);
+ Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec;
+ fi;
+ endfor;
+ else:
+ for k=3 upto BLong:
+ Intermed:=rotation(Pt[k-2],Pt[k-1],tourne);
+ if (demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectiontimes rec)<>(-1,-1):
+ Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec;
+ else:
+ Intermed:=rotation(Pt[k-2],Pt[k-1],-tourne);
+ Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec;
+ fi;
+ endfor;
+ fi;
+ % Ajout des faux points
+ path SPath[];
+ cpt[1]:=1;
+ cpt[BLong+1]:=BLong+1;
+ l[BLong+1]:=4;
+ for k=2 upto BLong:
+ SPath[k]=rec cutafter demidroite(Co,Pt[k]);
+ l[k]=arclength SPath[k];
+ l[k]:=arctime l[k] of rec;
+ cpt[k]:=k;
+ endfor;
+ QS(1,BLong+1);
+ for k=2 upto BLong+1:
+ if l[cpt[k]]-l[cpt[k-1]]>0.3:
+ nbfaux:=nbfaux+1;
+ FauxPt[nbfaux]=point(l[cpt[k-1]]+0.1) of rec;
+ nbfaux:=nbfaux+1;
+ FauxPt[nbfaux]=point(l[cpt[k]]-0.1) of rec;
+ fi;
+ endfor;
+ drawoptions();
+ % Tracés
+ drawarrow Pt[1]--(Pt[1]+1.5cm*unitvector(Pt[2]-Pt[1])) withpen pencircle scaled 1.25;
+ % Labelisation
+ for k=2 upto BLong:
+ if (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[1])<>(-1,-1):
+ dotlabel.bot(TEX(substring(k-1,k) of #1),Pt[k]);
+ elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[2])<>(-1,-1):
+ dotlabel.rt(TEX(substring(k-1,k) of #1),Pt[k]);
+ elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[3])<>(-1,-1):
+ dotlabel.top(TEX(substring(k-1,k) of #1),Pt[k]);
+ elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[4])<>(-1,-1):
+ dotlabel.lft(TEX(substring(k-1,k) of #1),Pt[k]);
+ fi;
+ endfor;
+ for k=1 upto nbfaux:
+ if (demidroite(Co,FauxPt[k]) intersectiontimes cote[1])<>(-1,-1):
+ dotlabel.bot(TEX(ChoixLettre),FauxPt[k]);
+ elseif (demidroite(Co,FauxPt[k]) intersectiontimes cote[2])<>(-1,-1):
+ dotlabel.rt(TEX(ChoixLettre),FauxPt[k]);
+ elseif (demidroite(Co,FauxPt[k]) intersectiontimes cote[3])<>(-1,-1):
+ dotlabel.top(TEX(ChoixLettre),FauxPt[k]);
+ elseif (demidroite(Co,FauxPt[k]) intersectiontimes cote[4])<>(-1,-1):
+ dotlabel.lft(TEX(ChoixLettre),FauxPt[k]);
+ fi;
+ endfor;
+ picture Reponse;
+ Reponse=image(
+ trace segment((0,0),(7*BLong*mm-2mm,0)) dashed dashpattern(on5mm off2mm);
+ );
+ trace Reponse shifted((xpart(Co),5mm)-center Reponse);
+ \end{Geometrie}%
+}%
+
+\def\MPBillardSolution#1#2#3{%
+ \mplibcodeinherit{enable}%
+ \begin{mplibcode}%
+ Figure(0,0,\useKV[ClesBillard]{Longueur}+2cm,\useKV[ClesBillard]{Largeur}+3cm);
+ trace rec;
+ % Tracés
+ drawarrow Pt[1]--(Pt[1]+1.5cm*unitvector(Pt[2]-Pt[1])) withpen pencircle scaled 1.25;
+ for k=1 upto BLong-1:
+ trace segment(Pt[k],Pt[k+1]);
+ endfor;
+ if Vrai=false:
+ for k=2 upto BLong-1:
+ trace codeperp(Pt[k-1],Pt[k],Pt[k+1],5);
+ endfor;
+ fi;
+ % Labelisation
+ if l1>3:
+ dotlabel.lft(TEX(substring(0,1) of #1),Pt[1]);
+ elseif l1>2:
+ dotlabel.top(TEX(substring(0,1) of #1),Pt[1]);
+ elseif l1>1:
+ dotlabel.rt(TEX(substring(0,1) of #1),Pt[1]);
+ else:
+ dotlabel.bot(TEX(substring(0,1) of #1),Pt[1]);
+ fi;
+ for k=2 upto BLong:
+ if (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[1])<>(-1,-1):
+ dotlabel.bot(TEX(substring(k-1,k) of #1),Pt[k]);
+ elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[2])<>(-1,-1):
+ dotlabel.rt(TEX(substring(k-1,k) of #1),Pt[k]);
+ elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[3])<>(-1,-1):
+ dotlabel.top(TEX(substring(k-1,k) of #1),Pt[k]);
+ elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[4])<>(-1,-1):
+ dotlabel.lft(TEX(substring(k-1,k) of #1),Pt[k]);
+ fi;
+ endfor;
+ trace Reponse shifted((xpart(Co),5mm)-center Reponse);
+ % On affiche les lettres de la réponse.
+ for k=1 upto BLong:
+ label.top(TEX(substring(k-1,k) of #1),((xpart(Co),5mm)-center Reponse)+(k-1)*(7mm,0)+(2.5mm,0));
+ endfor;
+ \end{mplibcode}%
+ \mplibcodeinherit{disable}%
+}% \ No newline at end of file