我想用 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 自动使用最合适的锚点来连接两个节点,所以您实际上没有三角形,而是有两条边。
尝试
\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
以查看填充不起作用的原因。如您所见,您拥有线段而不是三角形,线段是无法填充的开放对象。
还要注意,节点标签将隐藏在填充的三角形下,因此我使用背景层上的填充将标签留在顶部。