Bei kleinen Knoten, die mit TikZ gezeichnet wurden, werden keine Kreuzungen angezeigt

Bei kleinen Knoten, die mit TikZ gezeichnet wurden, werden keine Kreuzungen angezeigt

Ich versuche, mit TikZ ein paar Knoten zu zeichnen. Ich bin so weit gekommen:

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

Der Punkt ist, dass ich an jeder Kreuzung ein sichtbares „Oben und Unten“ brauche (also eine Clip-Breite ungleich Null). Im obigen Beispiel funktionieren die Kreuzungen nicht richtig. Wenn ich jedoch einen anderen (größeren) Knoten zeichne, wie:

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

alles ist in Ordnung. Was verursacht dieses seltsame Verhalten?

Antwort1

Das Problem liegt höchstwahrscheinlich daran, dass Ihre Kreuzungen zu nahe an den Enden zweier Stränge liegen, wodurch sie den Distanztest „Endtoleranz“ nicht bestehen. Mehr dazu weiter unten.


Das Knots-Paket führt einige komplizierte Dinge aus, um sicherzustellen, dass es alle möglichen Schnittpunkte erhält. Manchmal ist dies zu kompliziert, daher gibt es Optionen zum Deaktivieren einiger der umfangreicheren Routinen – und einige sind standardmäßig nicht aktiviert. Damit Ihr Paket funktioniert, müssen Sie ignore endpoint intersections=falseder knotUmgebung die Option „Option“ hinzufügen.

\begin{knot}Beachten Sie, dass zwischen und dem Beginn der optionalen Umgebung kein Leerzeichen stehen darf .

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

Beachten Sie, dass ich bei der Untersuchung der Vorgänge hier ein oder zwei Fehler in der Bibliothek entdeckt und dieVersion auf GitHub.

Aktualisierung: 15.12.2014Eine Sache, die mich hier verwirrte, warWarumdiese spezielle Kreuzung wurde von dem Test in beeinflusst, ignore endpoint intersectionsda dies kein Endpunkt ist und ich dachte, ich hätte den knotCode so geplant, dass dies nie ein Endpunkt wird (was passieren kann, wenn Pfade in Stücke geteilt werden). Kurz gesagt, der Endpunkttest ignoriert Kreuzungen, die als zu nahe an den Enden der Stränge liegend betrachtet werden. Die alternative Lösung in den Kommentaren hat das Spiel verraten. Das scale=0.3macht das Diagramm so klein, dass fast jeder Punkt darin innerhalb der Standardtoleranz der Endpunkte der Stränge liegt (beachten Sie, dass es, da der Pfad in zwei Stränge geteilt ist, einen Endpunkt bei gibt (1.5,0). Beachten Sie auch, dass es möglich ist, hier mit dem Schlüssel einen einzelnen Strang zu verwenden consider self intersections, aber dies hat immer noch das Endpunktproblem.). Die obige Lösung funktioniert, indem der Test „Sind wir nahe am Ende eines Strangs?“ ausgeschaltet wird. Eine Alternative besteht darin, den Test strenger zu gestalten, indem die Toleranz verringert wird. Glücklicherweise habe ich daran gedacht, als ich das ursprüngliche Paket geschrieben habe (habe es aber seitdem vergessen!) und es gibt einen Schlüssel, end tolerance=<dimen>um den Test zu verfeinern. Also:

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

funktioniert auch.

Antwort2

Das funktioniert, aber ich habe keine Ahnung, warum:

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

verknotet

Alternativ können Sie die Stile knot=colourund verwenden 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}

wieder verknotet

verwandte Informationen