Unirse a los caminos de Tikz sin problemas
Estoy tratando de usar Tikz para dibujar nudos de escalada .
Adapté el código de esta respuesta https://tex.stackexchange.com/a/283009/229885para dibujar una cuerda en 3D usando caminos Tikz (la idea básica es superponer muchos caminos de diferentes anchos y colores para obtener un aspecto 3D). Funciona muy bien, pero hay un problema que me molesta y no sé cómo solucionarlo.
En la imagen de abajo puedes ver dos nudos. El rosa se ha dibujado con un solo camino y el blanco se ha dibujado con dos caminos. Necesito romper los caminos para poder representar correctamente los cruces de cuerdas, pero cuando lo hago puedo ver una "costura" donde ambos caminos se encuentran.

Aquí está el código que utilicé para crear esta imagen:
\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}
Traté de definir nuevos estilos de flecha que extienden las rutas más allá de las coordenadas dadas, pero la costura sigue siendo visible pase lo que pase.
Mis preguntas son:
- ¿Es esta costura real o un artefacto creado por mi lector de PDF? (Estoy usando Atril 1.24.0 en Xubuntu 20.04.1)
- ¿Hay alguna forma de unir caminos Tikz sin problemas?
- Más en general, ¿hay una mejor manera de dibujar nudos de escalada en LaTeX?
Gracias de antemano,
Respuestas
Aquí hay una versión que vuelve a dibujar la parte del camino cerca del cruce para crear el aspecto de paso elevado. Esto es, en efecto, lo que hace el knots
paquete. Si desea dibujar caminos más complicados, entonces vale la pena investigar esa biblioteca, pero en este caso, porque sabemos dónde está la intersección, entonces no la necesitamos.
\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}
Esto produce la siguiente imagen.

Ahora, esto tiene artefactos en el límite del clip. Esto solo es visible en el visor y no aparecerá cuando se imprima. Aparece porque el trazado de recorte no es nítido y, por lo tanto, cuando se dibuja una línea, como en su estilo de cuerda, las partes de los niveles inferiores se muestran en el límite.
Una forma de evitar esto es asegurarse de que las capas inferiores estén recortadas con un círculo ligeramente más pequeño que las capas superiores (adaptando la idea al problema con "círculos de cultivo" en la biblioteca de nudos tikz ). Como sus trazados se dibujan dentro de un bucle, necesitamos proporcionar un gancho para agregar el trazado de recorte en el interior cuando sea necesario. Para hacer eso, agregué un alcance con un estilo opcional dentro de su comando. Pasando un clip adecuado a este, los artefactos se pueden eliminar.
\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}
Esto produce:

Puede acortar una ruta en una longitud negativa y, por lo tanto, alargarla para crear una pequeña superposición. Este truco cura las cosas en muchos espectadores, pero tal vez no en todos. Al menos no en todos los niveles de aumento.
\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}

Este es el zoom máximo en Vista previa en una Mac. Acrobat Reader también es perfecto para la mayoría de las ampliaciones, pero no para todas.
En principio, es posible obtener un resultado "perfecto" recortando parte del camino anterior. Aquí hay una versión increíblemente ajustada que usa 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}
Este no parece tener ningún problema técnico para aumentos o visores arbitrarios (solo probé Preview
y Acrobat Reader
). ¿Se podría calcular el 79.02pt
? Sí, al menos en este caso. Sin embargo, la forma más limpia de hacerlo es usar esta publicación .