summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/profcollege/metapost/PfCLabyNombre.mp
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-08-23 03:00:54 +0000
committerNorbert Preining <norbert@preining.info>2021-08-23 03:00:54 +0000
commit0ef3dfaccca426fb0f3b06fc106ef9b5b0423dad (patch)
tree81af6a2386d20cb4fc877f739ea43e4d63228875 /macros/latex/contrib/profcollege/metapost/PfCLabyNombre.mp
parent285f2e662f6dc37d227660aeb7624cac13004686 (diff)
CTAN sync 202108230300
Diffstat (limited to 'macros/latex/contrib/profcollege/metapost/PfCLabyNombre.mp')
-rw-r--r--macros/latex/contrib/profcollege/metapost/PfCLabyNombre.mp211
1 files changed, 211 insertions, 0 deletions
diff --git a/macros/latex/contrib/profcollege/metapost/PfCLabyNombre.mp b/macros/latex/contrib/profcollege/metapost/PfCLabyNombre.mp
new file mode 100644
index 0000000000..e6877ef34e
--- /dev/null
+++ b/macros/latex/contrib/profcollege/metapost/PfCLabyNombre.mp
@@ -0,0 +1,211 @@
+%Pile des cases du chemin
+pair PileChemin[];
+numeric indiceChemin;
+indiceChemin=0;
+
+vardef RAZPileChemin=
+ pair PileChemin[];
+ indiceChemin:=0;
+enddef;
+
+def PushChemin(expr tt)=
+ if indiceChemin<1:
+ PileChemin[1]:=tt;
+ indiceChemin:=1;
+ else:
+ PileChemin[indiceChemin+1]:=tt;
+ indiceChemin:=indiceChemin+1;
+ fi;
+enddef;
+
+def PopChemin=
+ if indiceChemin<1:
+ RAZPileChemin;
+ for k=-1 upto LargeurLaby:
+ for l=-1 upto LongueurLaby:
+ if (k=-1) or (k=LargeurLaby) or (l=-1) or (l=LongueurLaby):
+ CaseExploree[k][l]:=true;
+ else:
+ CaseExploree[k][l]:=false;
+ fi;
+ endfor;
+ endfor;
+ Mobile:=Depart;
+ PushChemin((choixligneD,choixcolonneD));
+ CaseExploree[choixligneD][choixcolonneD]:=true;
+ VoisinDispo(choixligneD,choixcolonneD);
+ else:
+ if indiceChemin>0:
+ CaseExploree[xpart(PileChemin[indiceChemin])][ypart(PileChemin[indiceChemin])]:=true;
+ fi;
+ indiceChemin:=indiceChemin-1;
+ fi;
+enddef;
+
+%Pile des cases voisines de la case parcourue
+pair PileVoisin[];
+numeric indiceVoisin;
+indiceVoisin=0;
+
+vardef RAZPileVoisin=
+ indiceVoisin:=0;
+enddef;
+
+def PushVoisin(expr tt)=
+ if indiceVoisin<1:
+ PileVoisin[1]:=tt;
+ indiceVoisin:=1;
+ else:
+ PileVoisin[indiceVoisin+1]:=tt;
+ indiceVoisin:=indiceVoisin+1;
+ fi;
+enddef;
+
+def PopVoisin=
+ if indiceVoisin<0:
+ %message("La pile n'existe pas");
+ else:
+ indiceVoisin:=indiceVoisin-1;
+ fi;
+enddef;
+
+vardef VoisinDispo(expr la,lo)=
+ RAZPileVoisin;
+ numeric nbvoisin;
+ nbvoisin=0;
+ if (la>-1) and (la<LargeurLaby) and (lo>-1) and (lo<LongueurLaby):
+ if CaseExploree[la+1][lo]=false:
+ nbvoisin:=nbvoisin+1;
+ PushVoisin((la+1,lo));
+ fi;
+ if CaseExploree[la-1][lo]=false:
+ nbvoisin:=nbvoisin+1;
+ PushVoisin((la-1,lo));
+ fi;
+ if CaseExploree[la][lo+1]=false:
+ nbvoisin:=nbvoisin+1;
+ PushVoisin((la,lo+1));
+ fi;
+ if CaseExploree[la][lo-1]=false:
+ nbvoisin:=nbvoisin+1;
+ PushVoisin((la,lo-1));
+ fi;
+ fi;
+enddef;
+
+vardef InitialisationLabyrinthe(expr long,larg)=
+ LargeurLaby:=larg;
+ LongueurLaby:=long;
+ pair M[][],N[][];%centre de la case, coinbg de la case
+ boolean CaseExploree[][];%Case Exploree ou pas
+ %on initialise les cases comme non explorées pour celles qui sont à l'intérieur du labyrinthe
+ %n=0;
+ for k=-1 upto larg:
+ for l=-1 upto long:
+ M[k][l]:=u*(0.5,-0.5)+u*(l,-k);
+ N[k][l]:=u*(l,-k-1);
+ if (k=-1) or (k=larg) or (l=-1) or (l=long):
+ CaseExploree[k][l]:=true;
+ else:
+ CaseExploree[k][l]:=false;
+ fi;
+ endfor;
+ endfor;
+enddef;
+
+vardef TraceLabyrinthe=
+ save $;
+ picture $;
+ $=image(
+ if Murs:
+ for k=1 upto LargeurLaby:
+ trace murgauche shifted(u*(0,-k));
+ endfor;
+ for k=0 upto LongueurLaby-1:
+ trace murhaut shifted(u*(k,-1));
+ endfor;
+ for k=1 upto LargeurLaby:
+ trace murdroit shifted(u*(LongueurLaby-1,-k));
+ endfor;
+ for k=0 upto LongueurLaby-1:
+ trace murbas shifted(u*(k,-LargeurLaby));
+ endfor;
+ for k=1 upto LargeurLaby-1:
+ for l=1 upto LongueurLaby-1:
+ trace Separation shifted(u*(l,-k));
+ endfor;
+ endfor;
+ else:
+ for k=0 upto LargeurLaby:
+ trace u*(0,0-k)--u*(LongueurLaby,0-k);
+ endfor;
+ for k=0 upto LongueurLaby:
+ trace u*(0+k,0)--u*(0+k,-LargeurLaby);
+ endfor;
+ fi;
+ );
+ $
+enddef;
+
+vardef murgauche=
+ save $;
+ picture $;
+ path pl[];
+ $=image(
+ %pl1=(0,0)--u*(0.15,0)--u*(0.15,0.2){dir180}..u*(0.08+uniformdeviate(0.05),0.2+uniformdeviate(0.1))..u*(0.09+uniformdeviate(0.015),0.3+uniformdeviate(0.2))..u*(0.08+uniformdeviate(0.04),0.5+uniformdeviate(0.2))..{dir0}u*(0.15,0.8)--u*(0.15,1)--u*(0,1)--cycle;
+ pl1=(0,0)--u*(0.1,0)..u*(0.02+uniformdeviate(0.05),0.25)..u*(0.1-uniformdeviate(0.03),0.5)..u*(0.02+uniformdeviate(0.05),0.75)..u*(0.1,1)--u*(0,1)--cycle;
+ remplis pl[1];
+ trace pl[1];
+ );
+ $
+enddef;%ok
+
+vardef murhaut=
+ save $;
+ picture $;
+ path pl[];
+ $=image(
+ pl1=u*(0,0.8)--u*(0,1)--u*(1,1)--u*(1,0.8)..u*(0.8+uniformdeviate(0.1),0.8+uniformdeviate(0.1))..u*(0.4+uniformdeviate(0.2),0.8-uniformdeviate(0.1))..u*(0.2+uniformdeviate(0.2),0.8+uniformdeviate(0.1))--cycle;
+ remplis pl[1];
+ trace pl[1];
+ );
+ $
+enddef;
+
+vardef murdroit=
+ save $;
+ picture $;
+ path pl[];
+ $=image(
+ pl1=u*(1,0)--u*(1-0.15,0)--u*(1-0.15,0.2){dir180}..u*(1-0.08+uniformdeviate(0.05),0.2+uniformdeviate(0.1))..u*(1-0.09+uniformdeviate(0.015),0.3+uniformdeviate(0.2))..u*(1-0.08+uniformdeviate(0.04),0.5+uniformdeviate(0.2))..{dir0}u*(1-0.15,0.8)--u*(1-0.15,1)--u*(1-0,1)--cycle;
+ remplis pl[1];
+ trace pl[1];
+ );
+ $
+enddef;%ok
+
+vardef murbas=
+ save $;
+ picture $;
+ path pl[];
+ $=image(
+ pl1=u*(0,0.2)--u*(0,0)--u*(1,0)--u*(1,0.2)..u*(0.8+uniformdeviate(0.1),0.2+uniformdeviate(0.1))..u*(0.4+uniformdeviate(0.2),0.2-uniformdeviate(0.1))..u*(0.2+uniformdeviate(0.2),0.2+uniformdeviate(0.1))--cycle;
+ remplis pl[1];
+ trace pl[1];
+ );
+ $
+enddef;
+
+vardef Separation=
+ save $;
+ picture $;
+ path pl[];
+ $=image(
+ pl1=u*(0.2,0)..u*(0.05+uniformdeviate(0.05),0.05+uniformdeviate(0.05))..u*(0,0.2)..u*(-0.1+uniformdeviate(0.05),0.05+uniformdeviate(0.05))..u*(-0.2,0)..u*(-0.1+uniformdeviate(0.05),-0.05-uniformdeviate(0.05))..u*(0,-0.2)..u*(0.05+uniformdeviate(0.05),-0.05-uniformdeviate(0.05))..cycle;
+ remplis pl[1];
+ trace pl[1];
+ );
+ $
+enddef;
+
+endinput