Rellenos superpuestos

Rellenos superpuestos

Me gustaría crear un gráfico que represente una pila de rectángulos. Lo ideal sería que un comando simple como \stack{5} creara una pila de 5.

Puedo usar el siguiente código:

\draw[fill=blue] (0.4,-0.4) rectangle +(3,2);
\draw[fill=blue] (0.3,-0.3) rectangle +(3,2);
\draw[fill=blue] (0.2,-0.2) rectangle +(3,2);
\draw[fill=blue] (0.1,-0.1) rectangle +(3,2);
\draw[fill=blue] (0.0,-0.0) rectangle +(3,2);

ingrese la descripción de la imagen aquí

Sin embargo, parece difícil convertir eso en un comando, y si necesitamos mover la pila, es complicado cambiar todas las coordenadas. Estaba pensando que esto podría ser mejor:

\draw[fill=blue] (0.4,-0.4)
  rectangle +(3,2) ++(-0.1,0.1)
  rectangle +(3,2) ++(-0.1,0.1)
  rectangle +(3,2) ++(-0.1,0.1)
  rectangle +(3,2) ++(-0.1,0.1)
  rectangle +(3,2) ++(-0.1,0.1);

ingrese la descripción de la imagen aquí

Esto tiene la ventaja de que cambiarlo solo cambia las coordenadas en un lugar obvio, e incluso queda un poco más claro acerca de lo que se pretende.

Desafortunadamente, esta segunda versión primero llena todos los rectángulos y luego dibuja sus contornos, por lo que el rectángulo "superior" no cubre el resto de la pila.

¿Existe una forma sencilla de dibujar regiones superpuestas utilizando comandos de dibujo relativos?

Respuesta1

Aquí hay una solución que aprovecha el hecho de que las rutas construidas usando el edgecomando están separadas y, por lo tanto, se dibujan por separado. Un edgetrazado es tan flexible como un totrazado, por lo que se puede adaptar para dibujar casi cualquier cosa, incluido un rectángulo. Así definimos una novedad to pathy un edgeestilo que evoca. él.

\documentclass{article}
%\url{http://tex.stackexchange.com/q/68555/86}
\usepackage{tikz}

\tikzset{
  edge rectangle/.style={
    to path={ rectangle (\tikztotarget)}
  }
}

\begin{document}
\begin{tikzpicture}
\draw[every edge/.append style={edge rectangle,fill=blue}] (0.4,-0.4)
  edge +(3,2) ++(-0.1,0.1)
  edge +(3,2) ++(-0.1,0.1)
  edge +(3,2) ++(-0.1,0.1)
  edge +(3,2) ++(-0.1,0.1)
  edge +(3,2) ++(-0.1,0.1);
\end{tikzpicture}
\end{document}

Esto da como resultado lo siguiente:

rectángulos apilados mediante comandos de borde

Respuesta2

Simplemente puedes empaquetar todo en un comando.

\documentclass{article}

\usepackage{tikz}

\newcommand{\stack}[3][5]{  
\foreach \x in {1,...,#1}
 { \draw[fill=blue] (\x/10,-\x/10) rectangle +(#2,#3); }
}

\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}
  \stack{3}{2};
  \stack[2]{-2}{3};
\end{tikzpicture}
\end{document}

Salida de muestra

Respuesta3

Aquí hay una solución simple basada en la respuesta de Andrew Swann:

versión renderizada del tex

\documentclass{article}
\usepackage{tikz}
% \stack{5}{(4,0)}{(3,2)}{Label} draws a stack of 5 at (4,0) with dimensions (3,2)
% and labels the center with "Label"
\newcommand{\stack}[4]{
  \foreach \i in {1,...,#1} {
    \draw[fill=blue!50] #2 ++({0.1*(#1)},{-0.1*(#1)}) ++({-0.1*\i},{0.1*\i}) rectangle +#3;
  }
  \path #2 -- +#3 node[pos=0.5] {#4};
}
\begin{document}
\begin{tikzpicture}
\stack{5}{(0,0)}{(3,2)}{I}
\stack{3}{(4,0)}{(3,2)}{II}
\stack{1}{(8,0)}{(3,2)}{III}
\end{tikzpicture}
\end{document}

información relacionada