Cruzamentos não aparecem para pequenos nós desenhados usando TikZ

Cruzamentos não aparecem para pequenos nós desenhados usando TikZ

Estou tentando fazer alguns nós com o TikZ. Eu cheguei até aqui:

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

A questão é que preciso de uma "parte superior e inferior" visível em cada cruzamento (ou seja, largura de clipe diferente de zero). No exemplo acima, as travessias não funcionam corretamente. No entanto, se eu desenhar um nó diferente (maior), como:

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

tudo está bem. O que está causando esse comportamento estranho?

Responder1

O problema provavelmente se deve ao fato de seus cruzamentos estarem muito próximos das extremidades de dois fios, fazendo com que eles falhem no teste de distância de “tolerância final”. Mais sobre isso abaixo.


O pacote de nós faz algumas coisas complicadas para tentar garantir que obtenha todas as interseções possíveis. Às vezes, isso é complicado demais, então há opções para desativar algumas das rotinas mais extensas - e algumas não estão habilitadas por padrão. Para fazer o seu funcionar, você precisa adicionar a opção option ignore endpoint intersections=falseao knotambiente.

Observe que você não deve ter um espaço entre \begin{knot}e o início do ambiente 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}

Observe que ao investigar o que estava acontecendo aqui, descobri um ou dois bugs na biblioteca e atualizei oversão no github.

Atualização: 15/12/2014Uma coisa que estava me intrigando aqui erapor queesse cruzamento em particular estava sendo afetado pelo teste envolvido, ignore endpoint intersectionsjá que não é um ponto final e pensei ter planejado o knotcódigo para que nunca se tornasse um ponto final (o que pode acontecer quando os caminhos são divididos em pedaços). Resumindo, o teste de ponto final ignora cruzamentos considerados muito próximos das extremidades dos fios. A solução alternativa nos comentários denunciou o jogo. Isso scale=0.3torna o diagrama tão pequeno que quase todos os pontos dentro dele estão dentro da tolerância padrão dos pontos finais das cadeias (observe que, como o caminho é dividido em duas cadeias, há um ponto final em (1.5,0). Observe também que é possível use um único fio aqui usando a chave, consider self intersectionsmas isso ainda tem o problema do ponto final.). A solução acima funciona desligando a opção "estamos perto do fim de um fio?" teste. Uma alternativa é tornar o teste mais rigoroso diminuindo a tolerância. Felizmente, pensei nisso quando escrevi o pacote original (embora o tivesse esquecido desde então!) e há uma chave end tolerance=<dimen>para refinar o teste. Por isso:

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

também funciona.

Responder2

Isso funciona, mas não tenho ideia do porquê:

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

atado

Como alternativa, use os estilos knot=coloure 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}

amarrado novamente

informação relacionada