Rejoindre les chemins Tikz de manière transparente

Nov 29 2020

J'essaie d'utiliser Tikz pour dessiner des nœuds d'escalade .

J'ai adapté le code de cette réponse https://tex.stackexchange.com/a/283009/229885pour dessiner une corde en 3D en utilisant des chemins Tikz (l'idée de base est de superposer de nombreux chemins de différentes largeurs et couleurs pour obtenir un look 3D). Cela fonctionne très bien, mais il y a un problème qui me dérange et je ne sais pas comment le résoudre.

Dans l'image ci-dessous, vous pouvez voir deux nœuds. Le rose a été dessiné en utilisant un seul chemin et le blanc a été dessiné en utilisant deux chemins. J'ai besoin de casser les chemins pour pouvoir représenter correctement les passages de corde, mais quand je le fais, je peux voir une "couture" où les deux chemins se rencontrent.

Voici le code que j'ai utilisé pour créer cette image:

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

J'ai essayé de définir de nouveaux styles de flèches qui étendent les chemins au-delà des coordonnées données, mais la couture est toujours visible quoi qu'il arrive.

Mes questions sont:

  • Cette couture est-elle réelle ou est-elle un artefact créé par mon lecteur PDF? (J'utilise Atril 1.24.0 sur Xubuntu 20.04.1)
  • Existe-t-il un moyen de rejoindre les chemins Tikz de manière transparente?
  • Plus généralement, y a-t-il une meilleure façon de dessiner des nœuds d'escalade dans LaTeX?

Merci d'avance,

Réponses

6 AndrewStacey Nov 29 2020 at 20:05

Voici une version qui redessine la partie du chemin près du croisement pour créer le look de franchissement. C'est en effet ce que fait le knotspackage. Si vous voulez dessiner des chemins plus compliqués, cette bibliothèque peut valoir la peine d'être étudiée, mais dans ce cas, parce que nous savons où se trouve l'intersection, nous n'en avons pas besoin.

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

Cela produit l'image suivante.

Maintenant, cela a des artefacts à la limite du clip. Ceci n'est visible que dans le visualiseur et n'apparaîtra pas lors de l'impression. Cela apparaît parce que le tracé de détourage n'est pas net et donc, lorsqu'une ligne est multipliée, comme dans votre style de corde, des parties des niveaux inférieurs apparaissent à la limite.

Une façon d'éviter cela est de s'assurer que les sous-couches sont coupées avec un cercle légèrement plus petit que les couches au-dessus d'eux (en adaptant l'idée au problème avec les "crop circles" dans la bibliothèque de nœuds tikz ). Lorsque vos chemins sont dessinés à l'intérieur d'une boucle, nous devons fournir un crochet pour ajouter le chemin de détourage à l'intérieur lorsque cela est nécessaire. Pour ce faire, j'ai ajouté une portée avec un style facultatif dans votre commande. En passant un clip approprié à cela, les artefacts peuvent être supprimés.

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

Cela produit:

8 Noname Nov 29 2020 at 16:11

Vous pouvez raccourcir un tracé d'une longueur négative, et ainsi l'allonger pour créer un petit chevauchement. Cette astuce guérit les choses sur de nombreux téléspectateurs mais peut-être pas sur tous. Du moins pas à tous les niveaux de grossissement.

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

Il s'agit du zoom maximal sous Aperçu sur un Mac. Acrobat Reader est également transparent pour la plupart des agrandissements, mais pas pour tous.

Il est, en principe, possible d'obtenir un résultat "parfait" en coupant une partie de l'ancien chemin. Voici une version incroyablement optimisée utilisant un 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}

Celui-ci ne semble pas avoir de pépins pour les agrandissements ou les téléspectateurs arbitraires (j'ai seulement testé Previewet Acrobat Reader). Pourrait-on calculer le 79.02pt? Oui, du moins dans ce cas. La meilleure façon de procéder, cependant, est d'utiliser ce message .