Empilements de cubes sous TikZ

Pour la rédaction d’un article, j’ai dû schématiser une grille régulière 3D (des cubes en fait). Après beaucoup d’hésitation entre TikZ et Inkscape, j’ai opté pour la première solution, que j’ai jugée plus flexible.

Cube élémentaire

Commençons par définir une commande qui dessinera un cube élémentaire aux coordonnées souhaitées :

Dans le préambule

\usepackage{tikz}
\newcommand{\elemcube}[4][blue]{	
        \draw [fill=#1!30,very thin] (#2+1,#3,#4) -- ++(0,1,0) -- ++(0,0,-1) -- ++(0, -1, 0) -- cycle;
        \draw [fill=#1!40,very thin] (#2,#3+1,#4) -- ++(1,0,0) -- ++(0,0,-1) -- ++(-1, 0, 0) -- cycle; 
        \draw [fill=#1!10,very thin] (#2,#3,#4)   -- ++(1,0,0) -- ++(0,1,0)  -- ++(-1, 0, 0) -- cycle;                         
}
 
\newenvironment{stackedboxes}{
	\begin{tikzpicture}[x=(220:0.5cm), y=(-40:0.5cm), z=(90:0.353cm)]
}{
	\end{tikzpicture}
}

Dans le corps de document

\begin{stackedboxes}
	\elemcube{0}{0}{0}
\end{stackedboxes}

Empilement de cubes

Ordre d’affichage

Là où ça se complique un peu, c’est que, compte-tenu de la façon dont est défini un cube élémentaire, TikZ n’est pas à même de déterminer qui de deux cubes doit cacher l’autre. C’est donc à nous de déterminer quel cube doit être affiché en premier.

Ainsi, les cubes doivent être classés suivants les règles suivantes (de la plus prioritaire à la moins prioritaire) :

  1. x croissants
  2. y croissants
  3. z croissants

Exemples

Cubes

\begin{stackedboxes}
	\elemcube{-1}{-1}{-1}
	\elemcube{-1}{-1}{0}
	\elemcube{-1}{0}{-1}
	\elemcube{-1}{0}{0}
	\elemcube{-1}{1}{-1}
	\elemcube{0}{-1}{-1}
	\elemcube{0}{-1}{0}	
	\elemcube{0}{0}{-1}
	\elemcube[red]{0}{0}{0}
	\elemcube{0}{1}{-1}
	\elemcube{1}{-1}{-1}
	\elemcube{1}{-1}{0}
	\elemcube{1}{0}{-1}
	\elemcube{1}{1}{-1}
\end{stackedboxes}

Fuck

\begin{stackedboxes}
	% F
	\elemcube{-2}{0}{3}
	\elemcube{-1}{0}{1}
	\elemcube{-1}{0}{3}
	\elemcube{0}{0}{0}
	\elemcube{0}{0}{1}
	\elemcube{0}{0}{2}
	\elemcube{0}{0}{3}
	% U	
	\def\y{3}
	\elemcube{-2}{\y}{0}	
	\elemcube{-2}{\y}{1}
	\elemcube{-2}{\y}{2}
	\elemcube{-2}{\y}{3}
	\elemcube{-1}{\y}{0}
	\elemcube{0}{\y}{0}
	\elemcube{0}{\y}{1}
	\elemcube{0}{\y}{2}
	\elemcube{0}{\y}{3}	
	% C	
	\def\y{6}
	\elemcube{-2}{\y}{0}	
	\elemcube{-2}{\y}{3}
	\elemcube{-1}{\y}{0}
	\elemcube{-1}{\y}{3}
	\elemcube{0}{\y}{0}	
	\elemcube{0}{\y}{1}					
	\elemcube{0}{\y}{2}					
	\elemcube{0}{\y}{3}
	% K
	\def\y{9}
	\elemcube{-2}{\y}{0}
	\elemcube{-2}{\y}{3}
	\elemcube{-1}{\y}{1}	
	\elemcube{-1}{\y}{2}
	\elemcube{0}{\y}{0}	
	\elemcube{0}{\y}{1}	
	\elemcube{0}{\y}{2}
	\elemcube{0}{\y}{3}													
\end{stackedboxes}