Ozdoba do samoczynnie przecinających się linii / krzywych

Nov 29 2020

Czy można zdefiniować dekorację / akcję, aby narysować podwójną linię, tak aby przecinająca się sama linia rysowała się nad sobą? Aby pokazać, o co mi chodzi, zobacz te spirale:

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

Górna spirala pokazuje efekt normalnej podwójnej linii, a dolna spirala pokazuje pożądany wynik. Chciałbym, aby wynik był wykonywany za pomocą jednego \drawpolecenia, aby uniknąć renderowania artefaktów i sprawić, aby smoothopcja działała na całej spirali.

Ostatecznie chcę móc użyć bieli jako koloru zewnętrznego, tworząc w ten sposób efekt skrzyżowania. Aby móc lepiej odpowiadać na pytania na tej stronie, np. Spirale stożkowe i cylindryczne

Pomyślałem, że powinno to być możliwe, wykonując dublowanie na małych odcinkach ścieżki w trakcie jej rysowania. Takie naiwne podejście:

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

nie działa, ponieważ działanie wstępne jest stosowane do całej ścieżki, a nie do segmentów.

Jeszcze lepszym rozwiązaniem byłaby sama ścieżka clip, tak aby skrzyżowanie ładnie wyglądało na innym niż białe tło. - Prawdopodobnie dość skomplikowane.

Odpowiedzi

3 Noname Nov 28 2020 at 23:47

Oto jeden sposób z 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}

Zwróć uwagę, że w tej odpowiedzi są już pełne style .

4 AndrewStacey Nov 30 2020 at 00:55

knotsBiblioteka TikZ obsługuje tego rodzaju rzeczy. Występuje niewielki problem z używaniem plotpolecenia rysowania, ponieważ tworzy wiele bardzo krótkich linii i nie jest to dobre dla sposobu, w jaki knotsdziała, ponieważ szuka przecięć między podścieżkami. Na szczęście, korzystając z hobbybiblioteki, mogę znacznie zmniejszyć liczbę próbek, ponieważ interpoluje ona za pomocą krzywych Beziera.

Te knotsprace bibliotekę odświeżanie tylko część krzywej na skrzyżowaniach, aby wywołać efekt wiadukt.

Użycie opcji podwójnej z knotsbiblioteką może powodować powstawanie artefaktów podczas przeglądania pliku PDF (ale nie podczas drukowania). Metoda ich usuwania jest szczegółowo opisana w problemie z "kręgami zbożowymi" w bibliotece węzłów tikz

Oto kod:

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

Wynik: