Я хотел бы создать график, представляющий стопку прямоугольников. В идеале мне нужна простая команда, например \stack{5}, для создания стопки из 5.
Я могу использовать следующий код:
\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);
Однако, кажется, это трудно превратить в команду, и если нам нужно сдвинуть стек, то будет хлопотно менять все координаты. Я подумал, что это может быть лучше:
\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);
Преимущество такого подхода в том, что при его перемещении изменяются координаты только в одном очевидном месте, и это даже немного яснее показывает, что именно имеется в виду.
К сожалению, во второй версии сначала заполняют все прямоугольники, а затем рисуют их контуры, поэтому «верхний» прямоугольник не покрывает остальную часть стопки.
Существует ли простой способ рисовать перекрывающиеся области с помощью относительных команд рисования?
решение1
Вот решение, которое использует тот факт, что пути, созданные с помощью edge
команды, являются отдельными и, таким образом, рисуются отдельно. edge
Путь так же гибок, как и to
путь, поэтому его можно адаптировать для рисования практически чего угодно, включая прямоугольник. Поэтому мы определяем новый to path
и edge
стиль, который вызывает его.
\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}
Это приводит к следующему:
решение2
Вы можете просто упаковать все в команду.
\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}
решение3
Вот простое решение, основанное на ответе Эндрю Суонна:
\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}