Bergabung dengan jalur Tikz dengan mulus
Saya mencoba menggunakan Tikz untuk menggambar simpul panjat .
Saya mengadaptasi kode dari jawaban ini https://tex.stackexchange.com/a/283009/229885menggambar tali 3D-ish menggunakan jalur Tikz (ide dasarnya adalah untuk menempatkan banyak jalur dengan lebar dan warna berbeda untuk mendapatkan tampilan 3D). Ini berfungsi dengan baik, tetapi ada masalah yang mengganggu saya dan saya tidak tahu bagaimana menyelesaikannya.
Pada gambar di bawah ini Anda dapat melihat dua simpul. Yang merah muda telah digambar menggunakan satu jalur dan yang putih telah digambar menggunakan dua jalur. Saya perlu memutus jalur agar dapat merepresentasikan perlintasan tali dengan benar, tetapi saat melakukannya, saya dapat melihat "jahitan" tempat kedua jalur bertemu.

Berikut kode yang saya gunakan untuk membuat gambar ini:
\documentclass[tikz, border=2mm]{standalone}
%%% The "Rope" command %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% \Rope[further options]{color}{width}{path definition} %
% %
\newcommand{\Rope}[4][] %
{ \pgfmathsetmacro{\RopeLevels}{25} %
\foreach \RopeLevel in {1,...,\RopeLevels} %
{ \pgfmathsetmacro{\RopeShade} %
{100 * (\RopeLevel-0.5) / \RopeLevels} %
\pgfmathsetlengthmacro{\RopeWidth} %
{sqrt(pow(#3, 2) - pow(#3 * (\RopeLevel-1) / \RopeLevels, 2))} %
\draw[#2!\RopeShade!black, line width=\RopeWidth, #1] #4; %
} %
} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}
\Rope[rounded corners]{pink} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\Rope[rounded corners]{white}{2mm}{ (1.5, 0.0) to (2.5, 1.0) to (2.0, 1.0) }
\Rope[rounded corners]{white}{2mm}{ (2.0, 1.0) to (1.5, 1.0) to (2.5, 0.0) }
\end{tikzpicture}
\end{document}
Saya mencoba menentukan gaya panah baru yang memperluas jalur di luar koordinat yang diberikan, tetapi jahitannya masih terlihat apa pun yang terjadi.
Pertanyaan saya adalah:
- Apakah jahitan ini nyata atau artefak yang dibuat oleh pembaca PDF saya? (Saya menggunakan Atril 1.24.0 di Xubuntu 20.04.1)
- Apakah ada cara untuk bergabung dengan jalur Tikz dengan mulus?
- Secara umum, apakah ada cara yang lebih baik untuk menggambar simpul panjat di LaTeX?
Terima kasih sebelumnya,
Jawaban
Berikut adalah versi yang menggambar ulang bagian jalur di dekat persimpangan untuk membuat tampilan over-pass. Inilah, pada dasarnya, apa yang knots
paket itu lakukan. Jika Anda ingin menggambar jalur yang lebih rumit maka perpustakaan itu mungkin layak untuk dilihat tetapi dalam kasus ini karena kita tahu di mana persimpangannya maka kita tidak membutuhkannya.
\documentclass{article}
%\url{https://tex.stackexchange.com/q/572839/86}
\usepackage{tikz}
%%% The "Rope" command %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% \Rope[further options]{color}{width}{path definition} %
% %
\newcommand{\Rope}[4][] %
{ \pgfmathsetmacro{\RopeLevels}{25} %
\foreach \RopeLevel in {1,...,\RopeLevels} %
{ \pgfmathsetmacro{\RopeShade} %
{100 * (\RopeLevel-0.5) / \RopeLevels} %
\pgfmathsetlengthmacro{\RopeWidth} %
{sqrt(pow(#3, 2) - pow(#3 * (\RopeLevel-1) / \RopeLevels, 2))} %
\draw[#2!\RopeShade!black, line width=\RopeWidth, #1] #4; %
} %
} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}
\Rope[rounded corners]{pink} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\begin{scope}[xshift=1.5cm]
\Rope[rounded corners]{white} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\clip (0.5,0.5) circle[radius=3mm];
\Rope[rounded corners]{white} {2mm}{ (0.0, 0.0) to (1.0, 1.0) }
\end{scope}
\end{tikzpicture}
\end{document}
Ini menghasilkan gambar berikut.

Sekarang, ini memang memiliki artefak di batas klip. Ini hanya terlihat di penampil dan tidak akan muncul saat dicetak. Itu muncul karena jalur pemotongan tidak tajam dan ketika sebuah garis digambar berkali-kali, seperti pada gaya tali Anda, maka bagian dari tingkat yang lebih rendah akan terlihat melalui batas.
Salah satu cara untuk menghindari hal ini adalah dengan memastikan bahwa lapisan di bawah dipotong dengan lingkaran yang sedikit lebih kecil daripada lapisan di atasnya (menyesuaikan gagasan yang bermasalah dengan "lingkaran tanaman" di perpustakaan simpul tikz ). Saat jalur Anda digambar di dalam loop, kami perlu menyediakan hook untuk menambahkan jalur kliping di dalam saat diperlukan. Untuk melakukan itu, saya telah menambahkan ruang lingkup dengan gaya opsional di dalam perintah Anda. Dengan melewatkan klip yang sesuai untuk ini maka artefak dapat dihapus.
\documentclass{article}
%\url{https://tex.stackexchange.com/q/572839/86}
\usepackage{tikz}
%%% The "Rope" command %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% \Rope[further options]{color}{width}{path definition} %
% %
\newcommand{\Rope}[4][] %
{ \pgfmathsetmacro{\RopeLevels}{25} %
\foreach \RopeLevel in {1,...,\RopeLevels} %
{ \pgfmathsetmacro{\RopeShade} %
{100 * (\RopeLevel-0.5) / \RopeLevels} %
\pgfmathsetlengthmacro{\RopeWidth} %
{sqrt(pow(#3, 2) - pow(#3 * (\RopeLevel-1) / \RopeLevels, 2))} %
\begin{scope}[rope scope/.try]
\draw[#2!\RopeShade!black, line width=\RopeWidth, #1] #4; %
\end{scope}
} %
} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}
\Rope[rounded corners]{pink} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\begin{scope}[xshift=1.5cm]
\Rope[rounded corners]{white} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\tikzset{
rope scope/.code={
\clip (0.5,0.5) circle[radius={3mm + \RopeLevel/25 pt}];
}
}
\Rope[rounded corners]{white} {2mm}{ (0.0, 0.0) to (1.0, 1.0) }
\end{scope}
\end{tikzpicture}
\end{document}
Ini menghasilkan:

Anda dapat memperpendek jalur dengan panjang negatif, dan dengan demikian memperpanjangnya untuk membuat tumpang tindih kecil. Trik ini menyembuhkan banyak hal pada banyak pemirsa tetapi mungkin tidak pada semua. Setidaknya tidak pada semua tingkat pembesaran.
\documentclass[tikz, border=2mm]{standalone}
%%% The "Rope" command %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% \Rope[further options]{color}{width}{path definition} %
% %
\newcommand{\Rope}[4][] %
{ \pgfmathsetmacro{\RopeLevels}{25} %
\foreach \RopeLevel in {1,...,\RopeLevels} %
{ \pgfmathsetmacro{\RopeShade} %
{100 * (\RopeLevel-0.5) / \RopeLevels} %
\pgfmathsetlengthmacro{\RopeWidth} %
{sqrt(pow(#3, 2) - pow(#3 * (\RopeLevel-1) / \RopeLevels, 2))} %
\draw[#2!\RopeShade!black, line width=\RopeWidth, #1] #4; %
} %
} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}
\Rope[rounded corners]{pink} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\Rope[rounded corners]{white}{2mm}{ (1.5, 0.0) to (2.5, 1.0) to (2.0, 1.0) }
\Rope[rounded corners,shorten <=-0.2pt]{white}{2mm}{ (2.0, 1.0) to (1.5, 1.0) to (2.5, 0.0) }
\end{tikzpicture}
\end{document}

Ini adalah zoom maksimal di bawah Pratinjau di Mac. Acrobat Reader juga mulus untuk sebagian besar pembesaran, tetapi tidak untuk semua.
Pada prinsipnya, adalah mungkin untuk mendapatkan hasil yang "sempurna" dengan memotong beberapa jalan lama. Ini adalah versi yang sangat disetel menggunakan dash pattern
.
\documentclass[tikz, border=2mm]{standalone}
%%% The "Rope" command %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% \Rope[further options]{color}{width}{path definition} %
% %
\newcommand{\Rope}[4][]{% %
\pgfmathsetmacro{\RopeLevels}{25} %
\foreach \RopeLevel in {1,...,\RopeLevels} %
{ \pgfmathtruncatemacro{\RopeShade} %
{100 * (\RopeLevel-0.5) / \RopeLevels} %
\pgfmathsetlengthmacro{\RopeWidth} %
{sqrt(pow(#3, 2) - pow(#3 * (\RopeLevel-1) / \RopeLevels, 2))} %
\draw[#2!\RopeShade!black, line width=\RopeWidth, #1] #4; %
} %
} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}
\Rope[rounded corners]{pink} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\Rope[rounded corners]{white}{2mm}{ (1.5, 0.0) to (2.5, 1.0) to (1.5, 1.0) to (2.5, 0.0) }
\Rope[rounded corners,dash pattern=on 79.02pt off 80pt]{white}{2mm}{ (1.5, 0.0) to (2.5, 1.0) to (1.5, 1.0) to (2.5, 0.0) }
\end{tikzpicture}
\end{document}
Yang ini tampaknya tidak memiliki gangguan untuk pembesaran atau pemirsa yang sewenang-wenang (saya hanya menguji Preview
dan Acrobat Reader
). Bisakah seseorang menghitung 79.02pt
? Ya, setidaknya dalam kasus ini. Cara yang lebih bersih untuk pergi, bagaimanapun, adalah dengan menggunakan posting ini .