Estou tentando compor um gráfico direcionado com tikz.
Isso é o que consegui até agora:
\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}
No entanto, há espaço para melhorias:
De alguma forma, um corte tem uma curva acentuada. Percebi que isso pode ser contornado usando
net cross/.style = {}
, porém a interseção fica no meio da aresta e não quero issoSeria ótimo se os cortes cruzassem as bordas a 90 graus. Já tentei fazendo as cruzes
sloped
e usandodraw
withto
andin
andout
, porém parece que não é possível especificar um ângulo relativo a um nó ou orientação de coordenadas
Quero deixar o código do gráfico no nível mais alto possível, ou seja, seria ótimo se eu pudesse dizer algo como, por exemplo, "Quero fazer um corte nas arestas e1, e2, e4".
Alguma ideia?
Responder1
Receio não ter entendido sua pergunta corretamente. De qualquer forma, veja se a solução a seguir dá um resultado que está pelo menos em uma parte próximo do que você gostaria de ter:
Reescrevi completamente o seu código, mas você ainda pode restaurar partes que omiti devido ao mal-entendido da sua pergunta:
\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}
Como você pode ver, eu uso a biblioteca TikZ quoetes
para rotular arestas entre nós. Para "cortes" eu uso linhas tracejadas, mas é simples de transformar em linhas sólidas. Se alguns cortes tivessem que ser feitos por linhas retas, não seria difícil adicionar ou eliminar excedentes tracejados.