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);
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);
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 edge
comando están separadas y, por lo tanto, se dibujan por separado. Un edge
trazado es tan flexible como un to
trazado, por lo que se puede adaptar para dibujar casi cualquier cosa, incluido un rectángulo. Así definimos una novedad to path
y un edge
estilo 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:
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}
Respuesta3
Aquí hay una solución simple basada en la respuesta de Andrew Swann:
\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}