Пересечения не отображаются для маленьких узлов, нарисованных с помощью TikZ

Пересечения не отображаются для маленьких узлов, нарисованных с помощью TikZ

Я пытаюсь нарисовать несколько узлов с помощью TikZ. У меня получилось вот так:

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

Дело в том, что мне нужны видимые "верх и низ" на каждом пересечении (т.е. ненулевая ширина обрезки). В приведенном выше примере пересечения не работают должным образом. Однако, если я нарисую другой (больший) узел, например:

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

все в порядке. Что вызывает это странное поведение?

решение1

Проблема, скорее всего, связана с тем, что ваши пересечения находятся слишком близко к концам двух прядей, из-за чего они не проходят тест на расстояние «допуска конца». Подробнее об этом ниже.


Пакет knots делает некоторые сложные вещи, чтобы попытаться убедиться, что он получает все возможные пересечения. Иногда это слишком сложно, поэтому есть опции для отключения некоторых из более обширных процедур - и некоторые не включены по умолчанию. Чтобы заставить ваш работать, вам нужно добавить option ignore endpoint intersections=falseв knotсреду.

\begin{knot}Обратите внимание, что между тегом и началом необязательного окружения не должно быть пробела .

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

Обратите внимание, что, исследуя происходящее, я обнаружил одну или две ошибки в библиотеке и обновилверсия на github.

Обновление: 2014-12-15Одна вещь, которая меня здесь озадачила, это то,почемуэто конкретное пересечение было затронуто тестом, ignore endpoint intersectionsпоскольку это не конечная точка, и я думал, что спланировал код knotтак, чтобы это никогда не стало конечной точкой (что может произойти, поскольку пути разделяются на части). Короче говоря, тест конечной точки игнорирует пересечения, которые считаются слишком близкими к концам нитей. Альтернативное решение в комментариях выдало игру. Это делает scale=0.3диаграмму настолько маленькой, что почти каждая точка внутри нее находится в пределах допуска по умолчанию конечных точек нитей (обратите внимание, что поскольку путь разделен на две нити, есть конечная точка в (1.5,0). Обратите также внимание, что здесь можно использовать одну нить с помощью ключа consider self intersections, но это все еще имеет проблему с конечной точкой.). Решение выше работает путем отключения теста «мы близки к концу нити?». Альтернативой является сделать тест более строгим, уменьшив допуск. К счастью, я подумал об этом, когда писал исходный пакет (хотя с тех пор забыл об этом!), и есть ключ end tolerance=<dimen>для уточнения теста. Таким образом:

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

тоже работает.

решение2

Это работает, но я понятия не имею, почему:

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

завязанный

В качестве альтернативы используйте стили knot=colourи 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}

снова завязанный

Связанный контент