我正在嘗試用 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
這個問題很可能是由於您的交叉點距離兩條線的末端太近,導致它們無法通過“末端公差”距離測試。下面詳細介紹這一點。
結包做了一些複雜的事情來嘗試確保它獲得所有可能的交叉點。有時,這過於複雜,因此有一些選項可以關閉一些更廣泛的例程 - 有些預設未啟用。為了使您的工作正常,您需要將 optionignore 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}