
Estou tentando fazer um desenho de salões de castelo com salões de baile:
Este é o código que tenho até agora (apenas uma parte do castelo):
\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}
Como posso conectar as linhas como na imagem?
Responder1
Aqui está uma maneira muito barata: basta desenhar sobre as bordas dos círculos.
Notas:
- Certamente, existe uma fórmula simples para calcular o valor adequado
outer sep
, ou seja, a distância que a linha dupla precisa para se projetar no círculo. - O
double
código é um pouco impreciso quando se trata de arco que faz com que algumas lascas pretas brilhem por ali.
Podemos resolver ambos desenhando outro círculo branco sobre os nós do círculo. Isto é o que as draw white circle
chaves fazem. Eles são desenhados no final da imagem tikz para que não haja mais flechas desenhadas depois.
Estou usando a cd
biblioteca/ tikz-cd
pacote porque ela combina uma matriz e uma maneira fácil de especificar a conexão entre nós.
No entanto, você também pode usar um
\matrix[matrix of nodes] (m) { … };
e depois é só usar (m-<row>-<column>)
para conectar os nós.
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}
Saída
Responder2
Eu descobri como fazer isso, mas duvido da qualidade do 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}