Dekoration für sich selbst kreuzende Linien / Kurven
Ist es möglich, eine Dekoration / Postaktion zu definieren, um eine doppelte Linie zu zeichnen, so dass eine sich selbst schneidende Linie über sich selbst zeichnet? Um zu zeigen, was ich meine, sehen Sie diese Spiralen:
\documentclass[tikz, border=1cm]{standalone}
\begin{document}
\begin{tikzpicture}
\draw[red, double=yellow, thick, domain=0:pi, smooth, samples=200] plot (\x, {cos(10*\x r)} , {sin(10*\x r)} );
\begin{scope}[yshift=-3cm]
\foreach \i in {1,...,10}
\draw[red, double=yellow, thick, domain=pi*(\i-1)/10:pi*\i/10, smooth, samples=200] plot (\x, {cos(10*\x r)} , {sin(10*\x r)} );
\end{scope}
\end{tikzpicture}
\end{document}

Die obere Spirale zeigt den Effekt einer normalen Doppellinie und die untere Spirale zeigt das gewünschte Ergebnis. Ich möchte, dass das Ergebnis mit nur einem \draw
Befehl erstellt wird, um das Rendern von Artefakten zu vermeiden und die smooth
Option über die gesamte Spirale hinweg funktionieren zu lassen.
Letztendlich möchte ich in der Lage sein, Weiß als Außenfarbe zu verwenden und dadurch einen Kreuzungseffekt zu erzeugen. Um Fragen auf dieser Seite besser beantworten zu können, zB konische und zylindirale Spiralen
Ich dachte, dass es möglich sein sollte, das Doppelte auf kleinen Abschnitten des Pfades zu machen, während er gezeichnet wird. Ein naiver Ansatz wie dieser:
\documentclass[tikz, border=1cm]{standalone}
\usetikzlibrary {decorations.pathmorphing}
\begin{document}
\begin{tikzpicture}
\draw[yellow,
decorate, decoration={zigzag, segment length=1mm, amplitude=0mm},
preaction={draw, ultra thick, red},
domain=0:pi, samples=200] plot (\x, {cos(10*\x r)} , {sin(10*\x r)} );
\end{tikzpicture}
\end{document}
funktioniert nicht, da die Vorbehandlung auf den gesamten Pfad und nicht auf die Segmente angewendet wird.
Eine noch bessere Lösung wäre, wenn der Weg clip
selbst könnte , so dass die Kreuzung auf einem nicht weißen Hintergrund schön aussehen würde. - Wahrscheinlich ziemlich kompliziert.
Antworten
Hier ist ein Weg mit dem show path construction
.
\documentclass[tikz, border=1cm]{standalone}
\usetikzlibrary{decorations.pathreplacing}
\begin{document}
\begin{tikzpicture}[path decomposition/.style={%
postaction={decoration={show path construction,
lineto code={
\draw[#1] (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);
},
curveto code={
\draw[#1] (\tikzinputsegmentfirst) .. controls
(\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
..(\tikzinputsegmentlast) ;
},
closepath code={
\draw[#1] (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast) {closepath};} }
,decorate}}]
\draw[red, double=yellow, thick, domain=0:pi, smooth, samples=200,
path decomposition={red, double=yellow, thick}] plot (\x, {cos(10*\x r)} , {sin(10*\x r)} );
\begin{scope}[yshift=-3cm]
\foreach \i in {1,...,10}
\draw[red, double=yellow, thick, domain=pi*(\i-1)/10:pi*\i/10, smooth, samples=200] plot (\x, {cos(10*\x r)} , {sin(10*\x r)} );
\end{scope}
\end{tikzpicture}
\end{document}

Bitte beachten Sie, dass es in dieser Antwort bereits vollständige Stile dafür gibt .
Die knotsTikZ-Bibliothek kümmert sich um solche Dinge. Es gibt ein kleines Problem bei der Verwendung des plot
Zeichnungsbefehls, da dadurch viele sehr kurze Linien knots
erstellt werden. Dies ist nicht besonders gut für die Funktionsweise, da nach Schnittpunkten zwischen Unterpfaden gesucht wird. Glücklicherweise hobbykann ich mit der Bibliothek die Anzahl der Samples erheblich reduzieren, da sie mithilfe von Bezierkurven interpoliert.
Die knots
Bibliothek zeichnet nur einen Teil der Kurve an den Schnittpunkten neu, um den Überführungseffekt zu erzielen.
Die Verwendung der Doppeloption mit der knots
Bibliothek kann zu Artefakten führen, wenn die PDF-Datei angezeigt wird (jedoch nicht, wenn sie gedruckt wird). Die Methode zum Entfernen ist bei Problemen mit "Kornkreisen" in der Tikz-Knotenbibliothek detailliert beschrieben
Hier ist der Code:
\documentclass{article}
%\url{https://tex.stackexchange.com/q/572737/86}
\usepackage{tikz}
\usetikzlibrary{knots,hobby}
\tikzset{
basic strand/.style={
red,
double=yellow,
double distance=1pt,
},
crossing strand/.style={
line width=1.8pt,
only when rendering/.style={%
draw=yellow,%
line width=1pt,
double=none,
}
}
}
\begin{document}
\begin{tikzpicture}[use Hobby shortcut]
\begin{knot}[
consider self intersections=true,
ignore endpoint intersections=false,
background colour=red,
every intersection/.style={
crossing strand
},
only when rendering/.style={
basic strand
},
clip width=1
]
\strand (0,1,0) \foreach \x in {1,...,80} { .. (\x/80*pi, {cos(22.5*\x )} , {sin(22.5*\x )} ) };
\end{knot}
\end{tikzpicture}
\end{document}
Ergebnis:
