Ich versuche, mit Tikz einen gerichteten Graphen zu setzen.
Das habe ich bisher bekommen:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows}
\tikzset{
net node/.style = {draw, circle, minimum size=8mm},
net edge/.style = {->, >=triangle 45}, % triangle 45 arrow is bigger than latex arrow % auto,
net cut/.style = {shorten >=-10mm, shorten <=-10mm, rounded corners=10mm, color=red},
net cross/.style = {sloped, allow upside down, pos=.3},
}
\begin{document}
\begin{tikzpicture}
\newcommand{\edge}[5][]{\draw[net edge, #1] (#3) -- coordinate[net cross, name=#2] node[pos=.7, auto]{#5} (#4);}
\node[net node, name=s ] at ( 0, 0) {$s$};
\node[net node, name=n1] at (-2,-2) {$n_1$};
\node[net node, name=n2] at ( 2,-2) {$n_2$};
\node[net node, name=t] at ( 0,-4) {$t$};
\edge[swap] {e1} {s} {n1} {1}
\edge {e2} {s} {n2} {1}
\edge[swap] {e3} {n1} {n2} {1}
\edge {e4} {n1} {t} {1}
\edge {e5} {n2} {t} {1}
\draw[net cut] (e1) -- (e2);
\draw[net cut] (e4) -- (e3) -- (e2);
\draw[net cut] (e4) -- (e5);
\draw[net cut] (e5) -- (e3) -- (e2); % Just a test!
\end{tikzpicture}
\end{document}
Es besteht jedoch noch Raum für Verbesserungen:
Irgendwie hat ein Schnitt eine scharfe Biegung. Mir ist klar geworden, dass man das umgehen kann, indem man verwendet
net cross/.style = {}
, aber dann liegt der Schnittpunkt in der Mitte der Kante und das möchte ich nichtEs wäre toll, wenn die Schnitte die Kanten in einem Winkel von 90 Grad kreuzen würden. Ich habe es bereits versucht, indem ich die Kreuze erstellt
sloped
unddraw
mitto
undin
und verwendet habeout
, aber es scheint, dass man keinen Winkel relativ zur Ausrichtung eines Knotens oder einer Koordinate angeben kann.
Ich möchte den Graphcode so weit oben wie möglich belassen, d. h. es wäre toll, wenn ich etwas sagen könnte wie z. B. „Ich möchte einen Schnitt über die Kanten e1, e2, e4 machen.“
Irgendwelche Ideen?
Antwort1
Ich fürchte, ich verstehe Ihre Frage nicht richtig. Sehen Sie trotzdem nach, ob die folgende Lösung ein Ergebnis liefert, das zumindest in einem Teil Ihrem Wunsch nahe kommt:
Ich habe Ihren Code komplett neu geschrieben, Sie können jedoch immer noch Teile wiederherstellen, die ich aufgrund eines Missverständnisses Ihrer Frage ausgelassen habe:
\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{arrows, quotes}
\begin{document}
\begin{tikzpicture}[
xs/.style = {xshift=#1 mm},
ys/.style = {yshift=#1 mm},
every edge quotes/.style = {auto, pos=0.5, % <-- =.3?
inner sep=2pt, font=\footnotesize}
]
\begin{scope}[every node/.style={circle, draw, minimum size=8mm}]
\node (s) at ( 0, 0) {$s$};
\node (n1) at (-2,-2) {$n_1$};
\node (n2) at ( 2,-2) {$n_2$};
\node (t) at ( 0,-4) {$t$};
\end{scope}
\draw[-triangle 45]
(s) edge ["1"] (n1)
(s) edge ["1"] (n2)
(n1) edge ["1"] (n2)
(n1) edge ["1"] (t)
(n2) edge ["1"] (t);
\draw[rounded corners=10mm, red, densely dashed]
([xs=-11] s.west) -- ([ys=-11] s.south) -- ([xs= 11] s.east)
([xs=-11] t.west) -- ([ys= 11] t.north) -- ([xs= 11] t.east)
([ys= 11] n1.north) -- ([xs= 11] n1.east) -- ([ys=-11] n1.south)
([ys= 11] n2.north) -- ([xs=-11] n2.west) -- ([ys=-11] n2.south);
\end{tikzpicture}
\end{document}
Wie Sie sehen, verwende ich die TikZ-Bibliothek quoetes
zum Beschriften von Kanten zwischen Knoten. Für „Schnitte“ verwende ich gestrichelte Linien, die sich jedoch leicht in durchgezogene Linien ändern lassen. Wenn einige Schnitte mit geraden Linien ausgeführt werden müssten, sollte es nicht schwierig sein, überzählige gestrichelte Linien hinzuzufügen oder zu löschen.