%%% % 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} \newtoks\toklisteVueCube% \def\UpdatetoksVueCube#1\nil{\addtotok\toklisteVueCube{#1,}}% \NewDocumentCommand\VueCubes{o m}{% \useKVdefault[VueCubes]% \setKV[VueCubes]{#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% \toklisteVueCube{}% \foreachitem\compteur\in\PfCListeHauteursCubes{\expandafter\UpdatetoksVueCube\compteur\nil}% \BuildVueCubes{\useKV[VueCubes]{Angle}}{\the\toklisteVueCube}% }{% \BuildVueCubes{\useKV[VueCubes]{Angle}}{}% }% }% }% \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% }%