Los cruces no aparecen en los nudos pequeños dibujados con TikZ

Los cruces no aparecen en los nudos pequeños dibujados con TikZ

Estoy intentando hacer algunos nudos con TikZ. Llegué hasta aquí:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{knots}
\begin{document}
$\begin{tikzpicture}[domain=-2:2, scale=0.3]
\begin{knot} [clip width=4]
\strand (0,2) to [out=down, in=down, looseness=1.8] (1.5,0);
\strand (1.5,0) to [out=up, in=up, looseness=1.8] (0,-2);
\end{knot}
\draw[dashed] (0,0) circle (2cm);
\end{tikzpicture}$
\end{document}

El punto es que necesito una "parte superior e inferior" visible en cada cruce (es decir, un ancho de clip distinto de cero). En el ejemplo anterior, los cruces no funcionan correctamente. Sin embargo, si dibujo un nudo diferente (más grande), como por ejemplo:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{knots}
\begin{document}
$\begin{tikzpicture}[domain=-2:2, scale=0.3]
\begin{knot} 
\strand (-1.3,1.3) to [out=right, in=right, looseness=2.2] (-1.3,-1.3);
\strand (1.3,1.3) to [out=left, in=left, looseness=2.2] (1.3,-1.3);
\end{knot}
\draw[dashed] (0,0) circle (2cm);
\end{tikzpicture}$
\end{document}

todo esta bien. ¿Qué está causando este extraño comportamiento?

Respuesta1

Lo más probable es que el problema se deba al hecho de que los cruces están demasiado cerca de los extremos de dos hilos, lo que hace que no pasen la prueba de distancia de "tolerancia final". Más sobre esto a continuación.


El paquete nudos hace algunas cosas complicadas para intentar garantizar que obtenga todas las intersecciones posibles. A veces, esto es demasiado complicado, por lo que hay opciones para desactivar algunas de las rutinas más extensas, y algunas no están habilitadas de forma predeterminada. Para que el suyo funcione, debe agregar la ignore endpoint intersections=falseopción de opción al knotentorno.

Tenga en cuenta que no debe haber un espacio entre el inicio \begin{knot}y el inicio del entorno opcional.

\documentclass{article}
%\url{http://tex.stackexchange.com/q/217719/86}
\usepackage{tikz}
\usetikzlibrary{knots}
\begin{document}
\begin{tikzpicture}[domain=-2:2, scale=0.3]
\begin{knot}[
  clip width=4,
  ignore endpoint intersections=false,
]
\strand (0,2) to [out=down, in=down, looseness=1.8] (1.5,0);
\strand (1.5,0) to [out=up, in=up, looseness=1.8] (0,-2);
\end{knot}
\draw[dashed] (0,0) circle (2cm);
\end{tikzpicture}
\end{document}

Tenga en cuenta que al investigar lo que estaba pasando aquí, descubrí uno o dos errores en la biblioteca y actualicé elversión en github.

Actualización: 2014-12-15Una cosa que me desconcertaba aquí era cómopor quéeste cruce en particular se estaba viendo afectado por la prueba involucrada, ignore endpoint intersectionsya que no es un punto final y pensé que había planeado el knotcódigo para que nunca se convirtiera en un punto final (lo que puede suceder cuando las rutas se dividen en pedazos). En resumen, la prueba de punto final ignora los cruces que se consideran demasiado cerca de los extremos de los hilos. La solución alternativa en los comentarios delató el juego. Esto scale=0.3hace que el diagrama sea tan pequeño que casi todos los puntos dentro de él están dentro de la tolerancia predeterminada de los puntos finales de los hilos (tenga en cuenta que debido a que el camino se divide en dos hilos, hay un punto final en (1.5,0). Tenga en cuenta también que es posible use una sola hebra aquí usando la clave consider self intersections, pero esto todavía tiene el problema del punto final). La solución anterior funciona desactivando el mensaje "¿estamos cerca del final de un hilo?" prueba. Una alternativa es hacer la prueba más rigurosa disminuyendo la tolerancia. Afortunadamente, pensé en eso cuando escribí el paquete original (¡aunque lo había olvidado desde entonces!) y hay una clave end tolerance=<dimen>para refinar la prueba. De este modo:

\begin{tikzpicture}[domain=-2:2, scale=.3]
\begin{knot}[
  clip width=4,
  end tolerance=1pt,
]
\strand (0,2) to [out=down, in=down, looseness=1.8]
(1.5,0);
\strand (1.5,0) to [out=up, in=up, looseness=1.8]
(0,-2);
\end{knot}
\draw[dashed] (0,0) circle (2cm);
\end{tikzpicture}

también funciona.

Respuesta2

Esto funciona pero no tengo idea de por qué:

\documentclass[tikz, border=5pt, mult, varwidth]{standalone}
\usetikzlibrary{knots}
\begin{document}
  \begin{tikzpicture}[domain=-2:2, scale=0.3]
    \begin{knot} [clip width=4]
      \strand (0,2) to [out=down, in=down, looseness=1.8] (1.5,0);
      \strand (1.5,0) to [out=up, in=up, looseness=1.8] (0,-2);
      \strand (1.5,0) to [out=up, in=up, looseness=1.8] (0,-2);
    \end{knot}
    \draw[dashed] (0,0) circle (2cm);
  \end{tikzpicture}
\end{document}

anudado

Alternativamente, use los estilos knot=coloury knot gap=factor:

\documentclass[tikz, border=5pt, mult, varwidth]{standalone}
\usetikzlibrary{knots}
\begin{document}
  \begin{tikzpicture}[domain=-2:2, scale=0.3, knot gap=7]
      \draw [knot=black] (0,2) to [out=down, in=down, looseness=1.8] (1.5,0) ;
      \draw [knot=black] (1.5,0) to [out=up, in=up, looseness=1.8] (0,-2);
    \draw[dashed] (0,0) circle (2cm);
  \end{tikzpicture}
\end{document}

anudado de nuevo

información relacionada