重なり合う塗りつぶし

重なり合う塗りつぶし

長方形のスタックを表すグラフィックを作成したいと思います。理想的には、\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 か所の座標のみが変更され、意図がさらに明確になるという利点があります。

残念ながら、この 2 番目のバージョンでは、最初にすべての長方形を塗りつぶしてから、その輪郭を描画するため、「上部」の長方形がスタックの残りの部分をカバーしません。

相対描画コマンドを使用して重複領域を描画する簡単な方法はありますか?

答え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 の回答に基づいた簡単な解決策です。

レンダリングされたバージョンの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}

関連情報