Kontrollpunkte von Bézierkurven in TikZ
Wer schonmal Bézierkurven in TikZ gezeichnet hat, weiß wie nervig es ist, wenn man die Position der Kontrollpunkte nicht sieht und sich alles nur vorstellen muss. Jedes mir bekannte Programm, in welchem man grafisch Bézierkurven zeichnen kann, zeigt die Kontrollpunkte an, also warum nicht auch TikZ?
Sucht man in Google, wird man schnell fündig. Insbesondere auf tex.stackexchange.com findet man immer wieder den gleichen Code in leicht unterschiedlichen Varianten. Hier nun meine eigene.
Hier ist der Code, verpackt in einem Minimalbeispiel:
\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,shapes}
\tikzset{show curve controls/.style={
decoration={
show path construction,
curveto code={
\draw [blue!50]
(\tikzinputsegmentfirst) -- (\tikzinputsegmentsupporta)
(\tikzinputsegmentlast) -- (\tikzinputsegmentsupportb);
\fill [red!50]
(\tikzinputsegmentsupporta) circle [radius=1.5pt]
(\tikzinputsegmentsupportb) circle [radius=1.5pt];
\node [diamond, draw, fill, solid, red!50, inner sep=0pt, minimum size=3pt] at (\tikzinputsegmentfirst) {};
\node [diamond, draw, fill, solid, red!50, inner sep=0pt, minimum size=3pt] at (\tikzinputsegmentlast) {};
}
}, postaction=decorate
}}
\begin{document}
\begin{tikzpicture}
\draw [show curve controls]
(-3,-1) .. controls ++(-90:-2.5) and ++(50:2) .. (0,0)
.. controls ++(50:-2) and ++(-90:2.5) .. (3,1);
\end{tikzpicture}
\end{document}
Viel zu erklären gibt es eigentlich nicht. Die spannenden Sachen passieren in TikZ selbst (postaction
, decoration
, show path construction
) und bewirken, dass für jedes Kurvensegment im Anschluss noch etwas getan wird. In diesem Fall das Zeichnen der Kontrollpunkte und Linien.
Beim Zeichnen der Bezierkurven nutze ich Polarkoordinaten, damit ich ohne groß nachzudenken einen glatten Verlauf bekomme. Beim Umgang mit Bézierkurven in TikZ sollte man noch beachten, dass die Kontrollpunkte mit zur Bounding Box gezählt werden. Erhält man also unerwartet einen leeren Rand, könnte es daran liegen. In diesem Fall hilft es nur, eine Bounding Box selbst festzulegen. (Wer eine andere Möglichkeit kennt, würde ich mich darüber freuen.)