重叠填充

重叠填充

我想创建一个表示矩形堆栈的图形。我理想情况下希望使用 \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 pathedge调用它的样式。

\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

以下是基于 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}

相关内容