我再次准备一个新的逻辑谜题;确切地说是 Resuko。
对于赛道,我希望有一座象征性的桥梁/地下桥-|-
。我搜索了这个网站,但只发现了这个问题:TikZ 中两条线的交点实际上并未连接
那里的答案似乎表明没有完整路径的自动解决方案。我很确定,我见过这种情况,但也许用 PSTricks 吧。有什么想法吗?
编辑:
不幸的是,Frédéric 的解决方案在集成到 后不起作用logicpuzzle.sty
。必须支持某些路径构造,例如trackpath
以下 MWE:
\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\makeatletter
\tikzstyle{bridge path}=[rounded corners=10pt,decorate,decoration={show path construction,
lineto code={
\draw [white,line width = 4pt,double=red,double distance=4pt]
(\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);},
curveto code={
\draw [red,line width = 4pt] (\tikzinputsegmentfirst) .. controls
(\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
..(\tikzinputsegmentlast);
}}]
\newcommand*\trackpath[3]%
{%
(#1.5,#2.5)%
\foreach \LP@direction in {#3}%
{%
\ifnum\LP@direction=1%
--++(-1,-1)%
\fi%
\ifnum\LP@direction=2%
--++(0,-1)%
\fi%
\ifnum\LP@direction=3%
--++(1,-1)%
\fi%
\ifnum\LP@direction=4%
--++(-1,0)%
\fi%
\ifnum\LP@direction=6%
--++(1,0)%
\fi%
\ifnum\LP@direction=7%
--++(-1,1)%
\fi%
\ifnum\LP@direction=8%
--++(0,1)%
\fi%
\ifnum\LP@direction=9%
--++(1,1)%
\fi%
};%
}%
%
\newcommand*\track[1]{
\draw[bridge path] #1;
}
\makeatother
\begin{document}
\begin{tikzpicture}
\track{\trackpath{0}{2}{6,2,2,4,8,6,6}}
\draw (0,0) grid[step=1] (3,3);
\end{tikzpicture}
\end{document}
然后,装饰就不再起作用了。:-( 它与 一起工作TikZ path
,\trackpath
似乎会引发问题。
知道发生什么问题了吗?
编辑2:
通过Frédéric改变道路构建方式的想法,我们得到了最终的解决方案:
\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\makeatletter
\tikzstyle{bridge path}=[rounded corners=10pt,decorate,decoration={show path construction,
lineto code={
\draw [white,line width = 4pt,double=red,double distance=4pt]
(\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);},
curveto code={
\draw [red,line width = 4pt] (\tikzinputsegmentfirst) .. controls
(\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
..(\tikzinputsegmentlast);
}}]
\newcommand*\trackpath[3]%
{%
(#1.5,#2.5)%
\foreach \LP@dir/\LP@length in {#3}%
{%
\ifnum\LP@dir=2%
--++(0,-\LP@length)%
\fi%
\ifnum\LP@dir=4%
--++(-\LP@length,0)%
\fi%
\ifnum\LP@dir=6%
--++(\LP@length,0)%
\fi%
\ifnum\LP@dir=8%
--++(0,\LP@length)%
\fi%
};%
}%
%
\newcommand*\track[1]{
\draw[bridge path] #1;
}
\makeatother
\begin{document}
\begin{tikzpicture}
\track{\trackpath{0}{2}{6/1,2/2,4/1,8/1,6/2}}
\draw (0,0) grid[step=1] (3,3);
\end{tikzpicture}
\end{document}
答案1
基本思路是使用双线,带白色边框。问题是 tikz 默认绘制路径的方式是绘制路径完全地第一次(白色边框)然后完全地第二次。解决这个问题的方法是使用装饰,更具体地说是“显示路径构造”装饰。这会分段装饰路径。
代码如下
\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\tikzstyle{bridge path}=[rounded corners=10pt,decorate,decoration={show path construction,
lineto code={
\draw [white,line width = 4pt,double=red,double distance=4pt]
(\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);},
curveto code={
\draw [red,line width = 4pt] (\tikzinputsegmentfirst) .. controls
(\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
..(\tikzinputsegmentlast);
}}]
\begin{document}
\begin{tikzpicture}
\draw[bridge path]
(0,2.5) -- (1.5,2.5) -- (1.5,0.5) -- (0.5,0.5)-- (0.5,1.5) -- (3,1.5);
\draw (0,0) grid[step=1] (3,3);
\end{tikzpicture}
\end{document}
结果是
评论Josef 的评论是,代码无法融入他的风格。据我所知,当指定路径的坐标之一也是交点之一时,就会出现问题。我不知道为什么会发生这种情况。作为一个快的修复,我会改变 Josef 编辑中指定路径的方式:我不会说向左/向右/向上/向下移动,而是给出路径弯曲位置(拐角)的坐标。也许 Andrew 的代码效果更好。
答案2
我本来想说,这正是knots
TikZ 库就是这样的,但在测试时我发现它不能很好地处理圆角。幸运的是,这是一个快速修复(现在在 CTAN 上)。
\documentclass[border=5pt]{standalone}
%\url{http://tex.stackexchange.com/q/115923/86}
\usepackage{tikz}
\usetikzlibrary{knots}
\begin{document}
\begin{tikzpicture}
\begin{knot}[
consider self intersections=true,
flip crossing=1,
]
\strand[rounded corners=10pt,line width=4pt,red]
(0,2.5) -- (1.5,2.5) -- (1.5,0.5) -- (0.5,0.5)-- (0.5,1.5) -- (3,1.5);
\end{knot}
\draw (0,0) grid[step=1] (3,3);
\end{tikzpicture}
\end{document}
底层机制与 Frédéric 的答案类似:使用选项double
绘制覆盖线。但是,此方法不是分段绘制路径,而是重新绘制交叉点附近的上部。这意味着路径的其余部分是“整体”绘制的,因此在连接处没有伪影。