用 tikz 繪製凸包

用 tikz 繪製凸包

我想用 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}

我使用 Node 添加了一個測試u4u5u6了解填充不起作用的原因。正如您所看到的,您擁有的是線段而不是三角形,線段是一個無法填滿的開放物件。

另請注意,節點標籤將隱藏在填充三角形下方,因此我使用背景圖層上的填充將標籤保留在頂部。

相關內容