Нарисуйте выпуклую оболочку с помощью 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}

Я добавил тест с использованием узлов u4, u5, u6чтобы увидеть, почему заливка не работает. Как видите, у вас есть сегменты линий, а не треугольник, сегмент линии — это открытый объект, который нельзя заполнить.

Также обратите внимание, что метки узлов будут скрыты под заполненным треугольником, поэтому я использовал заливку на фоновом слое, чтобы оставить метки сверху.

Связанный контент