![tikz-knots:带有圆圈的意外(?)行为](https://linux22.com/image/473194/tikz-knots%EF%BC%9A%E5%B8%A6%E6%9C%89%E5%9C%86%E5%9C%88%E7%9A%84%E6%84%8F%E5%A4%96%EF%BC%88%EF%BC%9F%EF%BC%89%E8%A1%8C%E4%B8%BA.png)
这是我的结:
我首先绘制红色+蓝色线条,这与 Hobby 曲线非常匹配。
\usepackage{tikz}
\usetikzlibrary{knots, hobby, shapes.geometric}
\begin{document}
\tikzset{
knot diagram/every strand/.append style={
ultra thick,
red
}}
\begin{tikzpicture}[use Hobby shortcut]
\begin{knot}[scale=2,
consider self intersections=true,%ignore endpoint
% intersections=false,
end tolerance=0.05mm,
draft mode=crossings,
flip crossing/.list={1,3},
clip width=8,
clip radius=8pt,
only when rendering/.style={
}
]
\strand ([closed]2,0) .. (3, 0) .. (4, 2) .. (1.5, 0) .. (1.8, -0.4)
.. (2.2, -0.4) .. (2.4, 0.4) .. (0, 2) .. (1, 0);
\end{knot}
\end{tikzpicture}
\end{document}
然后我添加了一个圆圈形式的绿色链接:
\usepackage{tikz}
\usetikzlibrary{knots, hobby, shapes.geometric}
\begin{document}
\tikzset{
knot diagram/every strand/.append style={
ultra thick,
red
}}
\begin{tikzpicture}[use Hobby shortcut]
\begin{knot}[scale=2,
consider self intersections=true,%ignore endpoint
% intersections=false,
end tolerance=0.05mm,
draft mode=crossings,
flip crossing/.list={1,3},
clip width=8,
clip radius=8pt,
only when rendering/.style={
}
]
\strand ([closed]2,0) .. (3, 0) .. (4, 2) .. (1.5, 0) .. (1.8, -0.4)
.. (2.2, -0.4) .. (2.4, 0.4) .. (0, 2) .. (1, 0);
\strand[green] (2, -0.5) circle[radius=2cm];
\end{knot}
\end{tikzpicture}
\end{document}
当然,交叉口编号已经改变,但这不是问题——我可以翻转它们。问题是标记为“2”的交叉口:它的位置不对。如果我尝试翻转它,情况会变得更糟(从图像放大):
我最终成功地使用第二条 Hobby 曲线绘制了绿色线 (*) 的这个结。我已经下定决心——我并不想寻求有关如何完成这个特定示例的进一步建议。但我渴望更好地掌握这个knots
库,我想了解为什么使用圆圈的尝试会出现这种情况-- 有人知道吗?我尝试过把圆圈变大、变小,并稍微向左和向右移动,但都无济于事……我不知道我是否遗漏了结点选项中的某些内容?除了圆圈的起点可能位于何处之外,它基本上与标记为 7 的交叉点对称,这处理得当……所以也许这与圆圈的起点有关?
(*)为了完整性,工作代码如下:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{knots, hobby, shapes.geometric}
\begin{document}
\tikzset{
knot diagram/every strand/.append style={
ultra thick,
red
}}
\begin{tikzpicture}[use Hobby shortcut]
\begin{knot}[scale=2,
consider self intersections=true,%ignore endpoint
% intersections=false,
end tolerance=0.05mm,
draft mode=crossings,
flip crossing/.list={1,4, 5,6 },
clip width=8,
clip radius=8pt,
only when rendering/.style={
}
]
\strand ([closed]2,0) .. (3, 0) .. (4, 2) .. (1.5, 0) .. (1.8, -0.4)
.. (2.2, -0.4) .. (2.4, 0.4) .. (0, 2) .. (1, 0);
\strand[green] ([closed]2, -1) .. (3.5, 0) .. (2, 1) .. (0.5, 0);
\end{knot}
\end{tikzpicture}
\end{document}
答案1
这不是一个答案,而是一个问题的解释。
当consider self intersections
设置为时true
,每条路径都会被分割成段,以便可以使用交点例程来查找其自交点。这样做时,它会删除仅由moveto
s 组成的空段。似乎对圆执行此操作时会出现错误,因为圆moveto
从中心开始到圆周上的某个点。通过删除各种剪辑,可以看到结库用于查找自交点的路径:
因此,当moveto
删除时,它就是错误的moveto
。这是一个错误。我在 github 上打开了一个问题:https://github.com/loopspace/spath3/issues/29