Dekoration für sich selbst kreuzende Linien / Kurven

Nov 29 2020

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 \drawBefehl erstellt wird, um das Rendern von Artefakten zu vermeiden und die smoothOption ü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 clipselbst könnte , so dass die Kreuzung auf einem nicht weißen Hintergrund schön aussehen würde. - Wahrscheinlich ziemlich kompliziert.

Antworten

3 Noname Nov 28 2020 at 23:47

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 .

4 AndrewStacey Nov 30 2020 at 00:55

Die knotsTikZ-Bibliothek kümmert sich um solche Dinge. Es gibt ein kleines Problem bei der Verwendung des plotZeichnungsbefehls, da dadurch viele sehr kurze Linien knotserstellt 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 knotsBibliothek zeichnet nur einen Teil der Kurve an den Schnittpunkten neu, um den Überführungseffekt zu erzielen.

Die Verwendung der Doppeloption mit der knotsBibliothek 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: