Nahtlose Verbindung von Tikz-Pfaden

Nov 29 2020

Ich versuche mit Tikz Kletterknoten zu ziehen .

Ich habe den Code aus dieser Antwort angepasst https://tex.stackexchange.com/a/283009/229885Zeichnen eines 3D-Seils mithilfe von Tikz-Pfaden (die Grundidee besteht darin, viele Pfade mit unterschiedlichen Breiten und Farben zu überlagern, um einen 3D-Look zu erhalten). Es funktioniert großartig, aber es gibt ein Problem, das mich stört und ich weiß nicht, wie ich es lösen soll.

Im Bild unten sehen Sie zwei Knoten. Der rosa wurde mit einem einzigen Pfad und der weiße mit zwei Pfaden gezeichnet. Ich muss die Pfade brechen, um Seilkreuzungen korrekt darstellen zu können, aber wenn ich das tue, sehe ich eine "Naht", an der sich beide Pfade treffen.

Hier ist der Code, mit dem ich dieses Bild erstellt habe:

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

Ich habe versucht, neue Pfeilstile zu definieren, die die Pfade über die angegebenen Koordinaten hinaus erweitern, aber die Naht ist immer noch sichtbar, egal was passiert.

Meine Fragen sind:

  • Ist diese Naht echt oder ein Artefakt, das von meinem PDF-Reader erstellt wurde? (Ich verwende Atril 1.24.0 unter Xubuntu 20.04.1)
  • Gibt es eine Möglichkeit, Tikz-Pfade nahtlos zu verbinden?
  • Gibt es im Allgemeinen eine bessere Möglichkeit, Kletterknoten in LaTeX zu zeichnen?

Danke im Voraus,

Antworten

6 AndrewStacey Nov 29 2020 at 20:05

Hier ist eine Version, die den Teil des Pfades in der Nähe der Kreuzung neu zeichnet, um den Überführungslook zu erstellen. Dies ist in der Tat das, was das knotsPaket tut. Wenn Sie kompliziertere Pfade zeichnen möchten, lohnt es sich möglicherweise, diese Bibliothek zu untersuchen. In diesem Fall benötigen wir sie jedoch nicht, da wir wissen, wo sich die Kreuzung befindet.

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

Dies erzeugt das folgende Bild.

Dies hat nun Artefakte an der Grenze des Clips. Dies ist nur im Viewer sichtbar und wird beim Ausdrucken nicht angezeigt. Es wird angezeigt, weil der Beschneidungspfad nicht scharf ist. Wenn also eine Linie wie in Ihrem Seilstil mehrfach gezeichnet wird, erscheinen Teile der unteren Ebenen an der Grenze durch.

Eine Möglichkeit, dies zu vermeiden, besteht darin, sicherzustellen, dass die unteren Ebenen mit einem etwas kleineren Kreis als die darüber liegenden Ebenen abgeschnitten sind (Anpassung der problematischen Idee mit "Kornkreisen" in der Tikz-Knotenbibliothek ). Da Ihre Pfade innerhalb einer Schleife gezeichnet werden, müssen wir einen Haken bereitstellen, um den Beschneidungspfad bei Bedarf hinzuzufügen. Zu diesem Zweck habe ich Ihrem Befehl einen Bereich mit einem optionalen Stil hinzugefügt. Durch Übergeben eines geeigneten Clips können die Artefakte entfernt werden.

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

Dies erzeugt:

8 Noname Nov 29 2020 at 16:11

Sie können einen Pfad um eine negative Länge kürzen und ihn so verlängern, um eine kleine Überlappung zu erzeugen. Dieser Trick heilt Dinge bei vielen Zuschauern, aber vielleicht nicht bei allen. Zumindest nicht bei allen Vergrößerungsstufen.

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

Dies ist der maximale Zoom unter Vorschau auf einem Mac. Acrobat Reader ist auch für die meisten Vergrößerungen nahtlos, aber nicht für alle.

Es ist im Prinzip möglich, ein "perfektes" Ergebnis zu erzielen, indem ein Teil des alten Pfades herausgeschnitten wird. Hier ist eine unglaublich optimierte Version mit a 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}

Dieser scheint keine Störungen für beliebige Vergrößerungen oder Betrachter zu haben (ich habe nur getestet Previewund Acrobat Reader). Könnte man das berechnen 79.02pt? Ja, zumindest in diesem Fall. Der sauberere Weg ist jedoch, diesen Beitrag zu verwenden .