在 tikz 中連接雙線

在 tikz 中連接雙線

我正在嘗試畫一張帶有舞廳的城堡大廳的圖片:

在此輸入影像描述

這是我到目前為止的程式碼(只是城堡的一部分):

\documentclass{article}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
    \tikzset{labyrinth/.style = {
        double,
        double distance = 2mm,
        line width = 1mm,
    }}
    \draw[labyrinth] (0,0) --++ (1,0) arc (90:0:1) arc (90:-90:1)
        arc (0:-90:1) --++ (-1,0) arc (-90:-180:1)
        arc (-90:-270:1) arc (180:90:1);
    \draw[labyrinth] (0,0) --++ (0,-4);
\end{tikzpicture}

\end{document}

如何讓線條像圖中那樣連結?

答案1

這是一個非常欺騙的方法:只需在圓圈的邊界上繪製即可。

筆記:

  • 當然,有一個簡潔的公式可以計算正確的outer sep,即雙線需要突出到圓中的距離。
  • double當涉及到電弧時,代碼有點不精確,這會導致一些黑色的細條穿過那裡。

我們可以透過在圓節點上繪製另一個白色圓圈來解決這兩個問題。這就是draw white circle鑰匙的作用。它們被繪製在 tikzpicture 的末尾,這樣之後就不再繪製箭頭了。


我正在使用cd圖書館/tikz-cd包是因為它結合了矩陣和指定節點之間連接的簡單方法。

但是,您也可以使用

\matrix[matrix of nodes] (m) { … };

然後只需使用(m-<row>-<column>)連接節點即可。

程式碼

\documentclass[border=2mm]{standalone}
\usepackage{tikz}\usetikzlibrary{cd}
\makeatletter
\tikzset{
  draw white circle/.code=%
    \edef\tikz@temp{\noexpand\pgfkeysvalueof{/tikz/draw White Circle/.@cmd}%
      {\the\pgfmatrixcurrentrow}{\the\pgfmatrixcurrentcolumn}\noexpand\pgfeov}%
    \expandafter\pgfutil@g@addto@macro\expandafter\tikz@atend@picture\expandafter{\tikz@temp}}
\makeatother
\tikzset{
  white circle radius/.initial=2.5mm,
  white circle color/.initial=white,
  draw White Circle/.code 2 args={%
    \fill[\pgfkeysvalueof{/tikz/white circle color}] (\tikzcdmatrixname-#1-#2.center) 
      circle[radius=\pgfkeysvalueof{/tikz/white circle radius}];}}
\begin{document}
\begin{tikzcd}[
  /tikz/labyrinth/.style  ={double, double distance = 2mm, line width = 1mm},
  every cell/.append style={nodes={
    circle, draw, line width=1mm, inner sep=0mm, minimum size=6mm,
    outer sep=+-.707\pgflinewidth, draw white circle}},
  column sep=5mm, row sep=5mm, arrows={labyrinth,-},
  arc rd/.style={rd, out=  0, in= 90}, arc ld/.style={ld, out=180, in= 90},
  arc dr/.style={dr, out=-90, in=180}, arc ru/.style={ur, out=  0, in=-90},
] 
  & & {} \rar \dar \ar[arc ld]
      & {} \ar[arc rd] \\
  & {} \ar[arc ld]
    & {} \ar[rr] \dar
      & & {} \ar[arc rd] \\
{} \ar[arc dr]
  & & {} \rar 
      & {} \rar
        & {} \rar
          & {} \\
  & {} \ar[uu] \rar \ar[arc dr]
    & {} \uar
      & & {} \uar \ar[arc ru] \\
  & & {} \uar\rar
      & {}\ar[uu] \ar[arc ru]
\end{tikzcd}
\end{document}

輸出

圖片

答案2

我已經弄清楚瞭如何做到這一點,儘管我懷疑程式碼的品質:

\documentclass{standalone}

\usepackage{tikz}

\begin{document}

    \begin{tikzpicture}
        \tikzset{labyrinth/.style = {
            double,
            double distance = 2mm,
            line width = 1mm,
        }}
        \tikzset{labyrinthWhite/.style = {
            double,
            double distance = 2mm,
            line width = 0mm,
            white
        }}
        \newcommand{\tmpCircle}[2]{\filldraw[fill = white, draw = black, line width = 1mm] (#1,#2) circle (3mm);}
        %
        \draw[labyrinth] (0,0) --++ (1,0) arc (90:0:1) arc (90:-90:1) arc (0:-90:1) --++ (-1,0) arc (-90:-180:1)
            arc (-90:-270:1) arc (180:90:1);
        \draw[labyrinth] (0,0) --++ (0,-4);
        \draw[labyrinth] (-1,-1) --++ (0,-2) --++ (1,0);
        \draw[labyrinth] (0,-1) --++ (2,0);
        \draw[labyrinth] (0,-2) --++ (3,0);
        \draw[labyrinth] (1,-2) --++ (0,-2);
        \draw[labyrinth] (2,-2) --++ (0,-1);
        %
        \foreach \y in {0,...,4}{
            \tmpCircle{0}{-\y}
        }
        \tmpCircle{1}{0}
        \tmpCircle{1}{-2}
        \tmpCircle{1}{-4}
        \tmpCircle{2}{-1}
        \tmpCircle{2}{-2}
        \tmpCircle{2}{-3}
        \tmpCircle{-1}{-1}
        \tmpCircle{-1}{-3}
        \tmpCircle{-2}{-2}
        \tmpCircle{3}{-2}
        %
        \draw[labyrinthWhite] (0,0) --++ (1,0) arc (90:0:1) arc (90:-90:1) arc (0:-90:1) --++ (-1,0) arc (-90:-180:1)
            arc (-90:-270:1) arc (180:90:1);
        \draw[labyrinthWhite] (0,0) --++ (0,-4);
        \draw[labyrinthWhite] (-1,-1) --++ (0,-2) --++ (1,0);
        \draw[labyrinthWhite] (0,-1) --++ (2,0);
        \draw[labyrinthWhite] (0,-2) --++ (3,0);
        \draw[labyrinthWhite] (1,-2) --++ (0,-2);
        \draw[labyrinthWhite] (2,-2) --++ (0,-1);
    \end{tikzpicture}

\end{document}

相關內容