%%% % Vue Cubes %%% \setKVdefault[VueCubes]{Solution=false,Hauteur=5,Profondeur=4,Largeur=3,Angle=60,Nom=Ex1,Trou=false,Echelle=0.25,CouleurCube=LightSteelBlue,CouleurFleche=LightGray,Face=false,Creation=false,Grilles=false,Seul=false,Perso=false,EclateX=0,EclateZ=0,EclateY=0} \newtoks\toklisteVueCube% \def\UpdatetoksVueCube#1\nil{\addtotok\toklisteVueCube{#1,}}% \def\UpdatetoksEmpilementPerso#1\nil{\addtotok\toklisteVueCube{"#1",}}% \NewDocumentCommand\VueCubes{o m}{% \useKVdefault[VueCubes]% \setKV[VueCubes]{#1}% \toklisteVueCube{}% \ifboolKV[VueCubes]{Perso}{% \setsepchar[*]{,*/}\ignoreemptyitems% \readlist*\ListeCouches{#2}% \reademptyitems% \foreachitem\compteur\in\ListeCouches{% \foreachitem\compteurdeux\in\ListeCouches[\compteurcnt]{% \expandafter\UpdatetoksEmpilementPerso\compteurdeux\nil% }% }% \BuildMPEmpilementPerso{\the\toklisteVueCube}{\ListeCoucheslen}{\listlen\ListeCouches[1]}% }{% \ifboolKV[VueCubes]{Solution}{% \BuildVueCubesSolution% }{% \ifboolKV[VueCubes]{Creation}{%Le nombre de données doit être compatible avec le "volume du pavé droit" \ignoreemptyitems% \readlist*\PfCListeHauteursCubes{#2}% \reademptyitems% \foreachitem\compteur\in\PfCListeHauteursCubes{\expandafter\UpdatetoksVueCube\compteur\nil}% \BuildVueCubes{\useKV[VueCubes]{Angle}}{\the\toklisteVueCube}% }{% \BuildVueCubes{\useKV[VueCubes]{Angle}}{}% }% }% }% }% \NewDocumentCommand{\BuildMPEmpilementPerso}{mmm}{% \ifluatex \mplibforcehmode \begin{mplibcode} nbcouches=#2; nblignes:=#3; input PfCSolid; intensite:=1.5; Ferme[0]:=false; outcolor:=\useKV[VueCubes]{CouleurCube};% incolor:=white; nb:=1;subh:=1; creux:=true; Phi := \useKV[VueCubes]{Angle}; Echelle:=\useKV[VueCubes]{Echelle}; EclateX:=\useKV[VueCubes]{EclateX}; EclateY:=\useKV[VueCubes]{EclateY}; EclateZ:=\useKV[VueCubes]{EclateZ}; string LesSymboles[]; string LesLignes[][]; TotalObj:=0; vardef CreationSolide(text t)= n:=0; for p_=t: n:=n+1; LesSymboles[n]=p_; endfor; for l=nbcouches downto 1: for k=nblignes downto 1: LesLignes[l][k]=LesSymboles[(nbcouches-l)*nblignes+(nblignes-k+1)]; endfor; endfor; for l=nbcouches downto 1: for k=nblignes downto 1: for m=0 upto (length(LesLignes[l][k])-1): if (substring((m,m+1)) of LesLignes[l][k])="x": TotalObj:=incr TotalObj; TR:=(Echelle*(nblignes-k)+Echelle*(nblignes-k)*EclateX,Echelle*(m+m*EclateY),Echelle*l-Echelle*(nbcouches-l)*EclateZ); ObjetDeplacement[TotalObj](0); fi; endfor; endfor; endfor; enddef; Initialisation(2500,Phi,20,50); Objetcube0("a="&decimal(Echelle)); CreationSolide(#1); nbobj:=TotalObj; DessineFusion; \end{mplibcode} \fi } \NewDocumentCommand\BuildVueCubes{m m}{% \ifluatex \mplibforcehmode \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}% \begin{mplibcode}[\PfCVueCubeNom] input PfCSolid; intensite:=1.5; Ferme[0]:=false; outcolor:=\useKV[VueCubes]{CouleurCube}; incolor:=white; nb:=1;subh:=1; creux:=true; Profondeur:=\useKV[VueCubes]{Profondeur}; Largeur:=\useKV[VueCubes]{Largeur}; Hauteur:=\useKV[VueCubes]{Hauteur}; Phi:=#1; Echelle:=\useKV[VueCubes]{Echelle}; color CouleurFleche; CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; boolean Trou,FaceVue,Creation,Grille; Trou:=\useKV[VueCubes]{Trou}; FaceVue:=\useKV[VueCubes]{Face}; Creation:=\useKV[VueCubes]{Creation}; Grille:=\useKV[VueCubes]{Grilles}; TotalObj:=0; vardef CreationSolide(text t)= PfCnbcubes:=0; for p_=t: m:=(PfCnbcubes div Profondeur); k:=(PfCnbcubes mod Profondeur); hauteurtour[m+1][k+1]:=p_; for l=1 upto hauteurtour[m+1][k+1]: TotalObj:=incr TotalObj; TR:=(-Echelle*k,(m+1)*Echelle,Echelle*l-Echelle/2); ObjetDeplacement[TotalObj](0); endfor; PfCnbcubes:=incr PfCnbcubes; endfor; enddef; Initialisation(2500,Phi,20,50); Objetcube0("a="&decimal(Echelle)); if Creation: CreationSolide(#2); else: for k=1 upto Profondeur:%4 profondeur hauteurtour[0][k]:=Hauteur;%5 hauteur totale endfor; for m=1 upto Largeur:%3 largeur for k=1 upto Profondeur:%4 profondeur if Trou: if m>1: hauteurtour[m][k]:=floor(uniformdeviate(hauteurtour[m-1][k]+1));%5 hauteur totale else: hauteurtour[m][k]:=1+floor(uniformdeviate(hauteurtour[m-1][k]));%5 hauteur totale fi; else: hauteurtour[m][k]:=1+floor(uniformdeviate(hauteurtour[m-1][k]));%5 hauteur totale fi; for l=1 upto hauteurtour[m][k]: TotalObj:=incr TotalObj; TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2); ObjetDeplacement[TotalObj](0); endfor; endfor; endfor; fi; % Pour la fleche path Fleche; color A[]; if FaceVue: A0=Echelle*(1,Largeur/2,0); A1-A0=0.25*(2,2,0); A2-A1=0.25*(0,-1,0); A3-A2=0.25*(2,0,0); A4-A3=0.25*(0,-2,0); A5-A4=A2-A3; A6-A5=A2-A1; Fleche=Projette(A0)--Projette(A1)--Projette(A2)--Projette(A3)--Projette(A4)--Projette(A5)--Projette(A6)--cycle; fill Fleche withcolor CouleurFleche; draw Fleche; fi; nbobj:=TotalObj; DessineFusion; if Grille: % dessus color Ad[]; Ad0=(0.5Echelle,0.5*Echelle,-0.5); Ad1-Ad0=(0,Largeur*Echelle,0); Ad2-Ad1=(-Profondeur*Echelle,0,0); Ad3-Ad2=Ad0-Ad1; draw Projette(Ad0) for k=1 upto 3: --Projette(Ad[k]) endfor --cycle; for k=1 upto Largeur-1: draw Projette((k/Largeur)[Ad0,Ad1])--Projette((k/Largeur)[Ad3,Ad2]); endfor; for k=1 upto Profondeur-1: draw Projette((k/Profondeur)[Ad0,Ad3])--Projette((k/Profondeur)[Ad1,Ad2]); endfor; % face color Af[]; Af0=(-1-Profondeur*Echelle,0.5*Echelle,0); Af1-Af0=(0,Largeur*Echelle,0); Af2-Af1=(0,0,Hauteur*Echelle); Af3-Af2=Af0-Af1; draw Projette(Af0) for k=1 upto 3: --Projette(Af[k]) endfor --cycle; for k=1 upto Largeur-1: draw Projette((k/Largeur)[Af0,Af1])--Projette((k/Largeur)[Af3,Af2]); endfor; for k=1 upto Hauteur-1: draw Projette((k/Hauteur)[Af0,Af3])--Projette((k/Hauteur)[Af1,Af2]); endfor; % droite color Adg[]; Adg0=(0.5Echelle,-Largeur*Echelle-1,0); Adg1-Adg0=(-Profondeur*Echelle,0,0); Adg2-Adg1=(0,0,Hauteur*Echelle); Adg3-Adg2=Adg0-Adg1; draw Projette(Adg0) for k=1 upto 3: --Projette(Adg[k]) endfor --cycle; for k=1 upto Profondeur-1: draw Projette((k/Profondeur)[Adg0,Adg1])--Projette((k/Profondeur)[Adg3,Adg2]); endfor; for k=1 upto Hauteur-1: draw Projette((k/Hauteur)[Adg0,Adg3])--Projette((k/Hauteur)[Adg1,Adg2]); endfor; fi; \end{mplibcode} \ifboolKV[VueCubes]{Seul}{}{% \ifboolKV[VueCubes]{Grilles}{}{% % \hspace*{1.5cm} \begin{mplibcode}[\PfCVueCubeNom] input PfCSolid; intensite:=1.5; Ferme[0]:=false; outcolor:=\useKV[VueCubes]{CouleurCube}; incolor:=white; nb:=1;subh:=1; creux:=true; Profondeur:=\useKV[VueCubes]{Profondeur}; Largeur:=\useKV[VueCubes]{Largeur}; Hauteur:=\useKV[VueCubes]{Hauteur}; Phi:=#1; Echelle:=\useKV[VueCubes]{Echelle}; color CouleurFleche; CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; TotalObj:=0; Initialisation(2500,Phi+90,30,50); Objetcube0("a="&decimal(Echelle)); for m=1 upto Largeur:%3 largeur for k=1 upto Profondeur:%4 profondeur for l=1 upto hauteurtour[m][k]: TotalObj:=incr TotalObj; TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); ObjetDeplacement[TotalObj](0); endfor; endfor; endfor; if Grille: undraw Projette(Ad0) for k=1 upto 3: --Projette(Ad[k]) endfor --cycle; undraw Projette(Af0) for k=1 upto 3: --Projette(Af[k]) endfor --cycle; undraw Projette(Adg0) for k=1 upto 3: --Projette(Adg[k]) endfor --cycle; fi; path Fleche; if FaceVue: Fleche=Projette(A0)--Projette(A1)--Projette(A2)--Projette(A3)--Projette(A4)--Projette(A5)--Projette(A6)--cycle; fill Fleche withcolor CouleurFleche; draw Fleche; fi; nbobj:=TotalObj; DessineFusion; \end{mplibcode} }% }% \fi }% \NewDocumentCommand\BuildVueCubesSolution{}{% \ifluatex% \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}% \begin{NiceTabular}{ccc}% Vue de face&Vue de dessus&Vue de gauche\\ {\begin{mplibcode}[\PfCVueCubeNom] input PfCSolid; intensite:=1.5; Ferme[0]:=false; outcolor:=\useKV[VueCubes]{CouleurCube}; incolor:=white; nb:=1;subh:=1; creux:=true; Profondeur:=\useKV[VueCubes]{Profondeur}; Largeur:=\useKV[VueCubes]{Largeur}; Hauteur:=\useKV[VueCubes]{Hauteur}; Phi:=0; Echelle:=\useKV[VueCubes]{Echelle}; color CouleurFleche; CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; TotalObj:=0; Initialisation(2500,Phi,0,50); Objetcube0("a="&decimal(Echelle)); for m=1 upto Largeur:%3 largeur for k=1 upto Profondeur:%4 profondeur for l=1 upto hauteurtour[m][k]: TotalObj:=incr TotalObj; TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); ObjetDeplacement[TotalObj](0); endfor; endfor; endfor; nbobj:=TotalObj; DessineFusion; \end{mplibcode}}& {\begin{mplibcode}[\PfCVueCubeNom] input PfCSolid; intensite:=1.5; Ferme[0]:=false; outcolor:=\useKV[VueCubes]{CouleurCube}; incolor:=white; nb:=1;subh:=1; creux:=true; Profondeur:=\useKV[VueCubes]{Profondeur}; Largeur:=\useKV[VueCubes]{Largeur}; Hauteur:=\useKV[VueCubes]{Hauteur}; Phi:=0; Echelle:=\useKV[VueCubes]{Echelle}; color CouleurFleche; CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; TotalObj:=0; Initialisation(2500,Phi,90,50); Objetcube0("a="&decimal(Echelle)); for m=1 upto Largeur:%3 largeur for k=1 upto Profondeur:%4 profondeur for l=1 upto hauteurtour[m][k]: TotalObj:=incr TotalObj; TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); ObjetDeplacement[TotalObj](0); endfor; endfor; endfor; nbobj:=TotalObj; DessineFusion; \end{mplibcode}}&{\begin{mplibcode}[\PfCVueCubeNom] input PfCSolid; intensite:=1.5; Ferme[0]:=false; outcolor:=\useKV[VueCubes]{CouleurCube}; incolor:=white; nb:=1;subh:=1; creux:=true; Profondeur:=\useKV[VueCubes]{Profondeur}; Largeur:=\useKV[VueCubes]{Largeur}; Hauteur:=\useKV[VueCubes]{Hauteur}; Phi:=-90; Echelle:=\useKV[VueCubes]{Echelle}; color CouleurFleche; CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; TotalObj:=0; Initialisation(2500,Phi,0,50); Objetcube0("a="&decimal(Echelle)); for m=1 upto Largeur:%3 largeur for k=1 upto Profondeur:%4 profondeur for l=1 upto hauteurtour[m][k]: TotalObj:=incr TotalObj; TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); ObjetDeplacement[TotalObj](0); endfor; endfor; endfor; nbobj:=TotalObj; DessineFusion; \end{mplibcode}}\\ \end{NiceTabular}% \fi% }%