当交叉点接近另一条(粗)线时,“结” tikz 库会出现意外行为:发生了什么?

当交叉点接近另一条(粗)线时,“结” tikz 库会出现意外行为:发生了什么?

我最近尝试画一些奥运五环使用 tikz 库“knots”,并遇到了一些意外行为。从链接的答案中可以看出,黑色和绿色环的下部交叉看起来有点奇怪。移除黄色环可以纠正此行为,因此一定是由于该环靠近交叉点。这种行为是故意的吗?这是一个错误吗?还是我犯了某种基本错误?

MWE 在链接的答案中给出,但我将在下面重现它:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{knots}
\begin{document} 
\begin{tikzpicture}
\definecolor{blue1}{RGB}{0,129,188}
\definecolor{yellow1}{RGB}{252,177,49}
\definecolor{black1}{RGB}{35,34,35}
\definecolor{green1}{RGB}{0,157,87}
\definecolor{red1}{RGB}{238,50,78}
\begin{knot}[clip width=1.5pt]
    \strand[line width=0.25cm,red1] (3,0) circle(1.25cm);
    \strand[line width=0.25cm,green1] (1.5,-1.375) circle(1.25cm);
    \strand[line width=0.25cm,black1] (0,0) circle(1.25cm);
    \strand[line width=0.25cm,yellow1] (-1.5,-1.375) circle(1.25cm);
    \strand[line width=0.25cm,blue1] (-3,0) circle(1.25cm);
    \flipcrossings{2,4,6,8}
\end{knot}
\end{tikzpicture}
\end{document}

答案1

这里有两个可行的版本。

第一个使用\redraw版本中稍微高级一些的命令在 github 上(警告:该存储库需要清理;唯一重要的文件是spath3.dtx)。评论中提到了这一点。更新\redraw在评估时而不是调用时评估传递给的坐标。这允许使用结点绘制例程定义的坐标,从而更容易定位特定的交叉点。

\begin{tikzpicture}
\definecolor{blue1}{RGB}{0,129,188}
\definecolor{yellow1}{RGB}{252,177,49}
\definecolor{black1}{RGB}{35,34,35}
\definecolor{green1}{RGB}{0,157,87}
\definecolor{red1}{RGB}{238,50,78}
\begin{knot}[
  clip width=1.5pt,
  name=olympic,
]
    \strand[line width=0.25cm,red1] (3,0) circle(1.25cm);
    \strand[line width=0.25cm,green1] (1.5,-1.375) circle(1.25cm);
    \strand[line width=0.25cm,black1] (0,0) circle(1.25cm);
    \strand[line width=0.25cm,yellow1] (-1.5,-1.375) circle(1.25cm);
    \strand[line width=0.25cm,blue1] (-3,0) circle(1.25cm);
\flipcrossings{2,4,6,8}
\redraw{2}{(olympic 3)}
\end{knot}
\end{tikzpicture}

结果:

奥运五环

第二个版本稍微调整了一下clip width和,clip radius以便第一次就正确。我开始认为这些命名不太好,因为即使我总是把它们搞混!简而言之,当一个交叉点被翻转时,它会以相反的顺序重新绘制,这样原来的下链就变成了上链。为了确保这只影响指定的交叉点,重绘被剪裁为围绕该交叉点的圆圈。这个剪裁圆的半径由键给出,clip radius是一个方面这样做的目的是将其设置得尽可能小,以最大限度地减少重绘的影响,同时使其足够大以使重绘成功。

clip width是独立的东西。绘制每条线时,首先将其绘制得稍微粗一些,颜色与背景相同。这是为了实现“剪切”效果,即上层线“剪切”其下层线的一部分。这clip width会影响此剪切路径的线宽。这是一个乘数切割路径的线宽是该乘数乘以绘制线的线宽。这里的想法是使改变线宽变得更容易,并使图表保持比例。

因此,这里有一个版本缩小了clip radius以确保问题交叉点不会影响相邻的交叉点,然后调整clip width以便在剪切圆内正确绘制切口。

这应该与 CTAN 上的当前版本兼容knots

\begin{tikzpicture}
\definecolor{blue1}{RGB}{0,129,188}
\definecolor{yellow1}{RGB}{252,177,49}
\definecolor{black1}{RGB}{35,34,35}
\definecolor{green1}{RGB}{0,157,87}
\definecolor{red1}{RGB}{238,50,78}
\begin{knot}[
  clip width=1.4,
  clip radius=0.31cm
]
    \strand[line width=0.25cm,red1] (3,0) circle(1.25cm);
    \strand[line width=0.25cm,green1] (1.5,-1.375) circle(1.25cm);
    \strand[line width=0.25cm,black1] (0,0) circle(1.25cm);
    \strand[line width=0.25cm,yellow1] (-1.5,-1.375) circle(1.25cm);
    \strand[line width=0.25cm,blue1] (-3,0) circle(1.25cm);
    \flipcrossings{2,4,6,8}
\end{knot}
\end{tikzpicture}

结果:

奥运五环 v2

完整代码:

\documentclass{article}
%\url{http://tex.stackexchange.com/q/323758/86}
\usepackage{tikz}
\usetikzlibrary{knots}
\begin{document} 
\begin{tikzpicture}
\definecolor{blue1}{RGB}{0,129,188}
\definecolor{yellow1}{RGB}{252,177,49}
\definecolor{black1}{RGB}{35,34,35}
\definecolor{green1}{RGB}{0,157,87}
\definecolor{red1}{RGB}{238,50,78}
\begin{knot}[
  clip width=1.4,
  clip radius=0.31cm
]
    \strand[line width=0.25cm,red1] (3,0) circle(1.25cm);
    \strand[line width=0.25cm,green1] (1.5,-1.375) circle(1.25cm);
    \strand[line width=0.25cm,black1] (0,0) circle(1.25cm);
    \strand[line width=0.25cm,yellow1] (-1.5,-1.375) circle(1.25cm);
    \strand[line width=0.25cm,blue1] (-3,0) circle(1.25cm);
    \flipcrossings{2,4,6,8}
\end{knot}
\end{tikzpicture}

\vspace{2cm}

\begin{tikzpicture}
\definecolor{blue1}{RGB}{0,129,188}
\definecolor{yellow1}{RGB}{252,177,49}
\definecolor{black1}{RGB}{35,34,35}
\definecolor{green1}{RGB}{0,157,87}
\definecolor{red1}{RGB}{238,50,78}
\begin{knot}[
  clip width=1.5pt,
  name=olympic,
]
    \strand[line width=0.25cm,red1] (3,0) circle(1.25cm);
    \strand[line width=0.25cm,green1] (1.5,-1.375) circle(1.25cm);
    \strand[line width=0.25cm,black1] (0,0) circle(1.25cm);
    \strand[line width=0.25cm,yellow1] (-1.5,-1.375) circle(1.25cm);
    \strand[line width=0.25cm,blue1] (-3,0) circle(1.25cm);
\flipcrossings{2,4,6,8}
\redraw{2}{(olympic 3)}
\end{knot}
\end{tikzpicture}
\end{document}

相关内容