Zeichnen Sie eine konvexe Hülle mit Tikz

Zeichnen Sie eine konvexe Hülle mit Tikz

Ich möchte mit Tikz eine konvexe Hülle zeichnen.

\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}

Wenn ich richtig liege, sollte dies ein ausgefülltes blaues Dreieck zeichnen. Aber das tut es nicht! Warum? Wenn ich stattdessen die Zeile auskommentiere \fill[red], sehe ich ein Ergebnis.

Danke, Adrian.

Antwort1

Dies liegt daran, dass TikZ automatisch den am besten geeigneten Anker verwendet, um zwei Knoten zu verbinden. Sie haben also nicht wirklich ein Dreieck, sondern zwei Kanten.

Versuchen

\fill[fill=blue] (u1.center) -- (u2.center) -- (u3.center) ;

Stattdessen wird der Unterschied angezeigt.

Andere Möglichkeiten sind die Verwendung

\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);
} 

stattdessen, da die Koordinaten automatisch über ihren „mittleren“ Anker verbunden werden.

Und schließlich könnte diese Möglichkeit noch ausgefeilter sein:

\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 {};
}

Dadurch haben Sie die Möglichkeit, die Beschriftungsposition für jede Koordinate individuell festzulegen, so dass diese nicht mit Verbindungslinien etc. in Konflikt gerät.

Antwort2

Bildbeschreibung hier eingeben

\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}

Ich habe einen Test mit Knoten u4, u5, hinzugefügt u6, um zu sehen, warum das Füllen nicht funktionierte. Wie Sie sehen, haben Sie Liniensegmente statt eines Dreiecks. Ein Liniensegment ist ein offenes Objekt, das nicht gefüllt werden kann.

Beachten Sie auch, dass Knotenbeschriftungen unter dem ausgefüllten Dreieck ausgeblendet werden. Daher habe ich die Füllung auf der Hintergrundebene verwendet, um die Beschriftungen oben zu belassen.

verwandte Informationen