Gráfico direcionado com cortes

Gráfico direcionado com cortes

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}

O resultado é quase bom:

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 isso

  • Seria ótimo se os cortes cruzassem as bordas a 90 graus. Já tentei fazendo as cruzes slopede usando drawwith toand inand out, 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:

insira a descrição da imagem aqui

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 quoetespara 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.

informação relacionada