Conectando líneas dobles en tikz.

Conectando líneas dobles en tikz.

Estoy intentando hacer un dibujo de los pasillos de un castillo con salones de baile:

ingrese la descripción de la imagen aquí

Este es el código que tengo hasta ahora (sólo una parte del castillo):

\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}

¿Cómo puedo hacer que las líneas se conecten como lo hacen en la imagen?

Respuesta1

Aquí tienes una forma muy engañosa: simplemente dibuja los bordes de los círculos.

Notas:

  • Seguramente existe una fórmula clara para calcular la distancia adecuada outer sep, es decir, la distancia que necesita la línea doble para sobresalir dentro del círculo.
  • El doublecódigo es un poco impreciso cuando se trata del arco, lo que hace que algunas astillas de negro brillen por allí.

Podemos resolver ambos simplemente dibujando otro círculo blanco sobre los nodos del círculo. Esto es lo que draw white circlehacen las llaves. Se dibujan al final de la imagen tikz para que ya no haya flechas que se dibujen después.


Estoy usando la cdbiblioteca/el tikz-cdpaquete porque combina una matriz y una manera fácil de especificar la conexión entre nodos.

Sin embargo, también puedes utilizar un

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

y luego simplemente úselo (m-<row>-<column>)para conectar los nodos.

Código

\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}

Producción

imagen

Respuesta2

Descubrí cómo hacerlo, aunque dudo de la calidad del código:

\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}

información relacionada