TikZ 中没有交叉点的交叉路径

TikZ 中没有交叉点的交叉路径

我再次准备一个新的逻辑谜题;确切地说是 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

我本来想说,这正是knotsTikZ 库就是这样的,但在测试时我发现它不能很好地处理圆角。幸运的是,这是一个快速修复(现在在 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绘制覆盖线。但是,此方法不是分段绘制路径,而是重新绘制交叉点附近的上部。这意味着路径的其余部分是“整体”绘制的,因此在连接处没有伪影。

自相交线

相关内容