
Ich versuche ein Bild von Schlosshallen mit Ballsälen zu zeichnen:
Dies ist der Code, den ich bisher habe (nur ein Teil des Schlosses):
\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}
Wie kann ich die Linien so verbinden, wie im Bild?
Antwort1
Hier ist eine ganz raffinierte Methode: Zeichnen Sie einfach über die Ränder der Kreise hinaus.
Anmerkungen:
- Sicherlich gibt es eine nette Formel zur Berechnung der richtigen
outer sep
, also der Distanz, die die Doppellinie in den Kreis hineinragen muss. - Der
double
Code ist in Bezug auf den Bogen etwas ungenau, was dazu führt, dass dort einige schwarze Splitter durchscheinen.
Wir können beides lösen, indem wir einfach einen weiteren weißen Kreis über die Kreisknoten zeichnen. Das machen die draw white circle
Schlüssel. Sie werden am Ende des Tikzbilds gezeichnet, sodass es keinen Pfeil mehr gibt, der danach gezeichnet wird.
Ich benutze die cd
Bibliothek/dietikz-cd
Paket, weil es eine Matrix und eine einfache Möglichkeit zum Angeben von Verbindungen zwischen Knoten kombiniert.
Sie können jedoch auch eine
\matrix[matrix of nodes] (m) { … };
und dann einfach verwenden(m-<row>-<column>)
um die Knoten zu verbinden.
Code
\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}
Ausgabe
Antwort2
Ich habe herausgefunden, wie es geht, zweifle jedoch an der Qualität des Codes:
\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}