
tikzで凸包を描きたいです。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{center}
\begin{tikzpicture}
\def\us{(0,2),(1,4),(2,0),(3,2),(4,1),(6,2),(6,4)}
\foreach \u [count=\i from 1] in \us {\node (u\i) at \u [right] {$u_\i$};}
\fill[fill=blue] (u1) -- (u2) -- (u3);
% \fill[red] (0,2) -- (2,0) -- (3,2);
\end{tikzpicture}
\end{center}
\end{document}
私の考えが正しければ、塗りつぶされた青い三角形が描画されるはずです。しかし、描画されません。なぜでしょうか。代わりに、その行をコメント アウトすると\fill[red]
、結果が表示されます。
ありがとう、エイドリアン。
答え1
これは、TikZ が 2 つのノードを接続するために最も適切なアンカーを自動的に使用するため、実際には三角形ではなく 2 つのエッジが存在するためです。
試す
\fill[fill=blue] (u1.center) -- (u2.center) -- (u3.center) ;
代わりに、違いが表示されます。
他の方法としては
\def\us{0/2,1/4,2/0,3/2,4/1,6/2,6/4}
\foreach \x/\y [count=\i from 1] in \us {
\coordinate[label=right:$u_\i$] (u\i) at (\x,\y);
}
代わりに、座標は「中心」アンカーを使用して自動的に接続されます。
最後に、より洗練された方法は次のようになります。
\def\us{(0,2)/left,(1,4)/right,(2,0)/right,
(3,2)/above,(4,1)/above,(6,2)/below,(6,4)/below}
\foreach \u/\pos [count=\i from 1] in \us {
\node[shape=coordinate,label=\pos:$u_\i$] (u\i) at \u {};
}
これにより、接続線などに干渉しないように、各座標ごとにラベルの位置を個別に設定できるようになります。
答え2
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{tikzpicture}
\def\us{(0,2),(1,4),(2,0),(3,2),(4,1),(6,2),(6,4)}
\foreach \u [count=\i from 1] in \us {\node (u\i) at \u [right] {$u_\i$};}
\begin{scope}[on background layer]
\fill[blue!20] (u1.center)--(u2.center)--(u3.center);
\end{scope}
%% For Test
\draw (u4)--(u5)--(u6)--cycle;
\end{tikzpicture}
\end{document}
塗りつぶしが機能しない理由を確認するために、ノードu4
、を使用したテストを追加しました。ご覧のとおり、三角形ではなく線分があります。線分は塗りつぶすことができない開いたオブジェクトです。u5
u6
また、ノード ラベルは塗りつぶされた三角形の下に隠れるので、背景レイヤーの塗りつぶしを使用してラベルを上に残すことに注意してください。