Dekorasi untuk garis / kurva yang menyilang sendiri

Nov 29 2020

Apakah mungkin untuk menentukan dekorasi / tindakan, untuk menggambar garis ganda sehingga garis yang berpotongan sendiri akan menggambar di atasnya? Untuk menunjukkan apa yang saya maksud lihat spiral ini:

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

Spiral atas menunjukkan efek garis ganda normal dan spiral bawah menunjukkan hasil yang diinginkan. Saya berharap hasilnya selesai hanya dengan satu \drawperintah untuk menghindari rendering artefak dan membuat smoothopsi berfungsi di seluruh spiral.

Akhirnya, saya ingin bisa menggunakan putih sebagai warna luar dan dengan demikian menciptakan efek persilangan. Untuk dapat menjawab pertanyaan dengan lebih baik di situs ini misalnya spiral berbentuk kerucut dan silinder

Saya berpikir bahwa itu harus dimungkinkan dengan membuat penggandaan pada segmen kecil dari jalan saat sedang digambar. Pendekatan naif seperti ini:

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

tidak berfungsi karena preaksi diterapkan ke seluruh jalur dan bukan segmen.

Solusi yang lebih baik adalah jika jalurnya bisa clipsendiri, sehingga persimpangan akan terlihat bagus pada latar belakang yang tidak putih. - Mungkin cukup rumit.

Jawaban

3 Noname Nov 28 2020 at 23:47

Berikut ini salah satu cara dengan 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}

Harap dicatat bahwa sudah ada gaya lengkap untuk ini dalam jawaban ini .

4 AndrewStacey Nov 30 2020 at 00:55

The knotsTikZ perpustakaan menangani hal semacam ini. Ada sedikit masalah dengan menggunakan plotperintah gambar karena itu menciptakan banyak garis yang sangat pendek dan itu tidak bagus untuk cara knotskerjanya karena mencari persimpangan antara sub jalur. Untungnya, dengan menggunakan hobbyperpustakaan saya dapat mengurangi jumlah sampel secara signifikan karena diinterpolasi menggunakan kurva bezier.

The knotsperpustakaan bekerja dengan menggambar ulang hanya bagian dari kurva di persimpangan untuk menghasilkan efek layang.

Menggunakan opsi ganda dengan knotspustaka bisa menghasilkan artefak saat PDF dilihat (tapi tidak saat dicetak). Metode untuk menghapusnya dirinci pada masalah dengan "lingkaran tanaman" di perpustakaan tikz knot

Berikut kodenya:

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

Hasil: