summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/profcollege/latex/PfCMidpoint.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/profcollege/latex/PfCMidpoint.tex')
-rw-r--r--macros/latex/contrib/profcollege/latex/PfCMidpoint.tex273
1 files changed, 273 insertions, 0 deletions
diff --git a/macros/latex/contrib/profcollege/latex/PfCMidpoint.tex b/macros/latex/contrib/profcollege/latex/PfCMidpoint.tex
new file mode 100644
index 0000000000..0813f66c44
--- /dev/null
+++ b/macros/latex/contrib/profcollege/latex/PfCMidpoint.tex
@@ -0,0 +1,273 @@
+%%%
+% Midpoint
+%%%
+\setKVdefault[MidPoint]{Solution=false,Graines=false,Hard=false}
+\defKV[MidPoint]{Graine=\setKV[MidPoint]{Graines}}
+
+\NewDocumentCommand\MidPoint{o}{%
+ \useKVdefault[MidPoint]%
+ \setKV[MidPoint]{#1}%
+ \BuildMidPoint
+}
+
+\NewDocumentCommand\BuildMidPoint{}{%
+ \ifluatex
+ \mplibforcehmode
+ \begin{mplibcode}
+ numeric Longueur,Largeur;
+ Longueur=8;
+ Largeur=4;
+ boolean Horizontal,Vertical,RetiensSens;
+ Horizontal=false;
+ Vertical=false;
+
+ boolean Solution,Hard,Graines;
+ Solution:=\useKV[MidPoint]{Solution};
+ Hard:=\useKV[MidPoint]{Hard};
+ Graines:=\useKV[MidPoint]{Graines};
+ if Graines:
+ randomseed:=\useKV[MidPoint]{Graine}
+ fi;
+
+ u:=8mm;
+
+ pair A[][];%centre des carrés.
+
+ vardef CherchePoint(expr basek,basel)=
+ % Si le déplacement précédent est horizontal, il faut passer en vertical
+ % Si le déplacement précédent est vertical, il faut passer en horizontal
+ p:=p+1;
+ if basel=ColonneArrivee:
+ RP[p]:=Arrivee;
+ else:
+ if Vertical:
+ %deplacement horizontal
+ ecart:=ColonneArrivee-basel;
+ if ecart=1:
+ Basel:=ColonneArrivee;
+ RP[p]:=A[basek][ColonneArrivee];
+ else:
+ Basel:=ceiling(basel+uniformdeviate(ecart));
+ RP[p]:=A[basek][Basel];
+ fi;
+ Basek:=basek;
+ Horizontal:=true;
+ Vertical:=false;
+ else:
+ %on vérifie qu'on peut se déplacer dans les deux sens.
+ % on choisit vertical positif ou vertical négatif
+ if basek=1:
+ choix:=0.75;
+ elseif basek=Largeur:
+ choix:=0.25;
+ else:
+ choix:=uniformdeviate(1);
+ fi;
+ if choix<0.5:
+ ecart:=basek-1;
+ if ecart=1:
+ Basek:=1;
+ RP[p]:=A[1][basel];
+ else:
+ Basek:=ceiling(uniformdeviate(ecart));
+ RP[p]:=A[Basek][basel];
+ fi;
+ Basel:=basel;
+ else:
+ ecart:=Largeur-basek;
+ if ecart=1:
+ Basek:=Largeur;
+ RP[p]:=A[Largeur][basel];
+ else:
+ Basek:=basek+ceiling(uniformdeviate(ecart));
+ RP[p]:=A[Basek][basel];
+ fi;
+ Basel:=basel;
+ fi;
+ Horizontal:=false;
+ Vertical:=true;
+ fi;
+ fi;
+enddef;
+
+vardef MidPoint(expr Aa,Bb)=
+ save $;
+ picture $;
+ $=image(
+ if Solution:
+ trace Aa--Bb withpen pencircle scaled 1.5;
+ fi;
+ if Hard:
+ NbMid:=NbMid+1;
+ if NbMid mod 2=0:
+ remplis cercles(1/2[Aa,Bb],1mm);
+ fi;
+ else:
+ remplis cercles(1/2[Aa,Bb],1mm);
+ fi;
+ );
+ $
+enddef;
+
+ % tracé de la grille
+ for k=1 upto 2*Largeur:
+ for l=-3 upto Largeur+Longueur-4:
+ trace (unitsquare scaled u) shifted (u*(l,-k)-center (unitsquare scaled u)) withcolor 0.5*white;
+ endfor;
+ endfor;
+
+ for k=1 upto Largeur:
+ for l=1 upto Longueur:
+ A[k][l]=u*(l,-k);
+ %trace (unitsquare scaled u) shifted (A[k][l]-center (unitsquare scaled u)) withcolor 0.5*white;
+ endfor;
+ endfor;
+
+%On choisit le premier déplacement
+ choix:=uniformdeviate(1);
+ if choix<0.5:
+ Horizontal:=true;
+ else:
+ Vertical:=true;
+ fi;
+
+ p:=0;
+ NbMid=ceiling(uniformdeviate(2));%Pour le niveau Hard
+
+ %1er rectangle
+LigneDepart:=2;%2;
+ColonneDepart:=1;
+LigneArrivee:=4;%4;
+ColonneArrivee:=8;
+pair Depart,Arrivee;
+Depart=A[LigneDepart][ColonneDepart];
+Arrivee=A[LigneArrivee][ColonneArrivee];
+
+pair RP[];%RetiensPoints
+RP[0]=Depart;
+
+Basek:=LigneDepart;
+Basel:=ColonneDepart;
+forever:
+ CherchePoint(Basek,Basel);
+ exitif RP[p]=Arrivee;
+endfor;
+
+if ypart(RP[p])=ypart(RP[p-1]):
+ RetiensSens:=true;
+else:
+ RetiensSens:=false;
+ p:=p-1;
+fi;
+
+%2eme rectangle
+for k=1 upto Largeur:
+ for l=1 upto Longueur:
+ A[k][l]:=u*(Longueur+l,-k);
+ endfor;
+endfor;
+
+LigneDepart:=4;
+ColonneDepart:=1;
+LigneArrivee:=2;
+ColonneArrivee:=8;
+Depart:=A[LigneDepart][ColonneDepart];
+Arrivee:=A[LigneArrivee][ColonneArrivee];
+
+Basek:=LigneDepart;
+Basel:=ColonneDepart;
+Retiens:=p;
+RP[p+1]:=Depart;
+
+forever:
+ CherchePoint(Basek,Basel);
+ exitif RP[p]=Arrivee;
+endfor;
+
+if ypart(RP[p])=ypart(RP[p-1]):
+ RetiensSens:=true;
+ p:=p-1;
+else:
+ RetiensSens:=false;
+fi;
+
+for h=(Retiens+1) upto p:
+ RP[h]:=symetrie(RP[h],u*(Longueur+0.5,-Largeur-0.5));
+endfor;
+%3eme Rectangle
+for k=1 upto Largeur:
+ for l=1 upto Longueur:
+ A[k][l]:=u*(2*Longueur+l,-k);
+ endfor;
+endfor;
+
+LigneDepart:=4;
+ColonneDepart:=2;
+LigneArrivee:=1;
+ColonneArrivee:=4;
+Depart:=A[LigneDepart][ColonneDepart];
+Arrivee:=A[LigneArrivee][ColonneArrivee];
+
+
+Basek:=LigneDepart;
+Basel:=ColonneDepart;
+Retiens:=p;
+RP[p+1]:=Depart;
+forever:
+ CherchePoint(Basek,Basel);
+ exitif RP[p]=Arrivee;
+endfor;
+for h=(Retiens+1) upto p:
+ RP[h]:=rotation(RP[h],u*(2*Longueur+0.5,-Largeur-0.5),90) shifted(u*(-2*Longueur,-Largeur));
+endfor;
+%4eme rectangle. On termine la boucle ?
+for k=1 upto Largeur:
+ for l=1 upto Longueur:
+ A[k][l]:=u*(3*Longueur+l,-k);
+ endfor;
+endfor;
+
+LigneDepart:=4;
+ColonneDepart:=1;
+LigneArrivee:=2;
+ColonneArrivee:=4;
+Depart:=A[LigneDepart][ColonneDepart];
+Arrivee:=A[LigneArrivee][ColonneArrivee];
+
+Basek:=LigneDepart;
+Basel:=ColonneDepart;
+Retiens:=p;
+RP[p+1]:=Depart;
+forever:
+ CherchePoint(Basek,Basel);
+ exitif RP[p]=Arrivee;
+endfor;
+
+if ypart(RP[p])=ypart(RP[p-1]):
+ p:=p-1;
+fi;
+
+if ypart(RP[0])=ypart(RP[1]):
+ RetiensSens:=true;
+else:
+ RetiensSens:=false;
+fi;
+
+for h=(Retiens+1) upto p:
+ RP[h]:=RP[h] shifted(u*(-3.5*Longueur,0));
+endfor;
+
+if RetiensSens:
+ RP[p+1]:=RP[1];
+ go:=1;
+else:
+ RP[p+1]:=RP[0];
+ go:=0;
+fi;
+
+for h=go upto p:
+ draw MidPoint(RP[h],RP[h+1]);
+endfor;
+\end{mplibcode}
+\fi
+}% \ No newline at end of file