%%% % Vue Cubes %%% \def\filedateVueCubes{2025/05/27}% \def\fileversionVueCubes{0.1c}% \message{-- \filedateVueCubes\space v\fileversionVueCubes}% % \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,TroisCouleur=false,TroisCouleurs={},Colores=false,ListeCouleurs={},Theta=20,Codes=false,Traces={},Visualisation=false} \defKV[VueCubes]{% TroisCouleurs=\ifempty{#1}{}{\setKV[VueCubes]{TroisCouleur}\setsepchar{,}\ignoreemptyitems\readlist*\ListeCouleursVueCubes{#1}},% ListeCouleurs=\ifempty{#1}{}{\setKV[VueCubes]{Colores}\setsepchar{,}\ignoreemptyitems\readlist*\ListeCouleursVueCubes{#1}},% Traces=\ifempty{#1}{}{\setKV[VueCubes]{Codes}}% }% % \newtoks\toklisteVueCube% \def\UpdatetoksVueCube#1\nil{\addtotok\toklisteVueCube{#1,}}% \def\UpdatetoksEmpilementPerso#1\nil{\addtotok\toklisteVueCube{"#1",}}% \NewDocumentCommand\VueCubes{o m}{% \newtoks\toklistecouleur\toklistecouleur{} \useKVdefault[VueCubes]% \setKV[VueCubes]{#1}% \toklisteVueCube{}% \ifboolKV[VueCubes]{TroisCouleur}{% \foreachitem\couleur\in\ListeCouleursVueCubes{\expandafter\UpdateCoul\couleur\nil}% }{}% \ifboolKV[VueCubes]{Colores}{% \foreachitem\couleur\in\ListeCouleursVueCubes{\expandafter\UpdateCoul\couleur\nil}% }{}% \ifboolKV[VueCubes]{Perso}{% \setsepchar[*]{,*/}\ignoreemptyitems% \readlist*\ListeCouches{#2}% \reademptyitems% \foreachitem\compteur\in\ListeCouches{% \foreachitem\compteurdeux\in\ListeCouches[\compteurcnt]{% \expandafter\UpdatetoksEmpilementPerso\compteurdeux\nil% }% }% \ifboolKV[VueCubes]{Colores}{% \BuildMPEmpilementPersoColore{\the\toklisteVueCube}{\ListeCoucheslen}{\listlen\ListeCouches[1]}{\the\toklistecouleur}% }{% \BuildMPEmpilementPerso{\the\toklisteVueCube}{\ListeCoucheslen}{\listlen\ListeCouches[1]}{\the\toklistecouleur}% }% }{% \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}{\useKV[VueCubes]{Nom}}{\the\toklistecouleur}%% }{% \BuildVueCubes{\useKV[VueCubes]{Angle}}{}{\useKV[VueCubes]{Nom}}{\the\toklistecouleur}%% }% }% }% }% \NewDocumentCommand\BuildMPEmpilementPerso{mmmm}{% \ifluatex% \mplibforcehmode% \begin{mplibcode} nbcouches=#2; nblignes:=#3; input PfCSolid; boolean TroisCouleur; TroisCouleur=\useKV[VueCubes]{TroisCouleur}; 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; if TroisCouleur: color retienscoul[]; n:=0; for p_=#4: n:=n+1; retienscoul[n]=p_; endfor; coulfaceX:=retienscoul[1]; coulfaceY:=retienscoul[2]; coulfaceZ:=retienscoul[3]; DessineFusionTroisCouleurs; else: DessineFusion; fi; \end{mplibcode}% \fi% }% \NewDocumentCommand\BuildVueCubes{m m m m}{% \ifluatex \mplibforcehmode \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}% \begin{mplibcode}[\PfCVueCubeNom] string NomRetenu; NomRetenu=str #3; input PfCSolid; boolean TroisCouleur; TroisCouleur=\useKV[VueCubes]{TroisCouleur}; 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; write decimal(TotalObj) to "PfCNombreCubes"&NomRetenu&".tex";% write EOF to "PfCNombreCubes"&NomRetenu&".tex";% % 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 TroisCouleur: color retienscoul[]; n:=0; for p_=#4: n:=n+1; retienscoul[n]=p_; endfor; coulfaceX:=retienscoul[1]; coulfaceY:=retienscoul[2]; coulfaceZ:=retienscoul[3]; DessineFusionTroisCouleurs; else: DessineFusion; fi; 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; boolean TroisCouleur; TroisCouleur=\useKV[VueCubes]{TroisCouleur}; 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; if TroisCouleur: color retienscoul[]; n:=0; for p_=#4: n:=n+1; retienscoul[n]=p_; endfor; coulfaceX:=retienscoul[1]; coulfaceY:=retienscoul[2]; coulfaceZ:=retienscoul[3]; DessineFusionTroisCouleurs; else: DessineFusion; fi; \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% }% \NewDocumentCommand\BuildMPEmpilementPersoColore{mmmm}{% \ifluatex \mplibforcehmode \begin{mplibcode} nbcouches=#2; nblignes:=#3; % hauteur:=\useKV[VueCubes]{Hauteur}; profondeur:=\useKV[VueCubes]{Profondeur}; largeur:=\useKV[VueCubes]{Largeur}; % boolean Codes,Visualisation; Codes=\useKV[VueCubes]{Codes}; Visualisation=\useKV[VueCubes]{Visualisation}; input PfCSolid; % intensite:=1.5; nb:=1;subh:=1; creux:=true; eclairage:=false; vardef RecupCouleurs(text t)= color Coul[]; nbcoul=0; for p_=t: nbcoul:=nbcoul+1; Coul[nbcoul]=p_; endfor; enddef; Phi := \useKV[VueCubes]{Angle}; Theta := \useKV[VueCubes]{Theta}; Echelle:=\useKV[VueCubes]{Echelle}; EclateX:=\useKV[VueCubes]{EclateX}; EclateY:=\useKV[VueCubes]{EclateY}; EclateZ:=\useKV[VueCubes]{EclateZ}; Initialisation(2500,Phi,Theta,50); 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; nbcubes=length LesLignes[nbcouches][nblignes]; 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])<>"o": TotalObj:=incr TotalObj; TR:=(Echelle*(nblignes-k)+Echelle*(nblignes-k)*EclateX,Echelle*(m+m*EclateY),Echelle*l-Echelle*(nbcouches-l)*EclateZ); outcolor:=Coul[scantokens(substring((m,m+1)) of LesLignes[l][k])]; Objetcube[TotalObj]("a="&decimal(Echelle)); fi; endfor; endfor; endfor; enddef; RecupCouleurs(#4); CreationSolide(#1); nbobj:=TotalObj; DessineFusion; if Visualisation: %Vue de dessus drawarrow chemin(Echelle*(((nblignes-1)/2),((nbcubes-1)/2),nbcouches+2.5),Echelle*(((nblignes-1)/2),((nbcubes-1)/2),nbcouches+1.5)); label.top(TEX("A"),Projette(Echelle*(((nblignes-1)/2),((nbcubes-1)/2),nbcouches+2.5))); %Vue de derriere drawarrow chemin(Echelle*(-2.5,((nbcubes-1)/2),((nbcouches+1)/2)),Echelle*(-1.5,((nbcubes-1)/2),((nbcouches+1)/2))); label.rt(TEX("B"),Projette(Echelle*(-2.5,((nbcubes-1)/2),((nbcouches+1)/2)))); %Vue de face drawarrow chemin(Echelle*(nblignes+1.5,((nbcubes-1)/2),((nbcouches+1)/2)),Echelle*(nblignes+0.5,((nbcubes-1)/2),((nbcouches+1)/2))); label.lft(TEX("D"),Projette(Echelle*(nblignes+1.5,((nbcubes-1)/2),((nbcouches+1)/2)))); %Vue de droite drawarrow chemin(Echelle*((nblignes-1)/2,nbcubes+2.5,((nbcouches+1)/2)),Echelle*((nblignes-1)/2,nbcubes+1.5,((nbcouches+1)/2))); label.rt(TEX("C"),Projette(Echelle*((nblignes-1)/2,nbcubes+2.5,((nbcouches+1)/2)))); %Vue de gauche drawarrow chemin(Echelle*((nblignes-1)/2,-3.5,((nbcouches+1)/2)),Echelle*((nblignes-1)/2,-2.5,((nbcouches+1)/2))); label.lft(TEX("E"),Projette(Echelle*((nblignes-1)/2,-3.5,((nbcouches+1)/2)))); fi; if Codes: \useKV[VueCubes]{Traces}; fi; \end{mplibcode}% \fi% }%