Ozdoba do samoczynnie przecinających się linii / krzywych
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 \draw
polecenia, aby uniknąć renderowania artefaktów i sprawić, aby smooth
opcja 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
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 .
knotsBiblioteka TikZ obsługuje tego rodzaju rzeczy. Występuje niewielki problem z używaniem plot
polecenia rysowania, ponieważ tworzy wiele bardzo krótkich linii i nie jest to dobre dla sposobu, w jaki knots
dział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 knots
prace bibliotekę odświeżanie tylko część krzywej na skrzyżowaniach, aby wywołać efekt wiadukt.
Użycie opcji podwójnej z knots
biblioteką 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:
