Gráfico dirigido con cortes.

Gráfico dirigido con cortes.

Estoy intentando componer un gráfico dirigido con tikz.

Esto es lo que obtuve hasta ahora:

\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}

El resultado es casi correcto:

Sin embargo, hay margen de mejora:

  • De alguna manera, un corte tiene una curva pronunciada. Me di cuenta de que esto se puede evitar usando net cross/.style = {}, sin embargo, entonces la intersección está en el medio del borde y no quiero eso.

  • Sería genial si los cortes cruzaran los bordes a 90 grados. Ya lo intenté haciendo las cruces slopedy usando drawwith toy inand out, sin embargo, parece que no se puede especificar un ángulo relativo a un nodo o la orientación de las coordenadas.

Quiero dejar el código del gráfico en el nivel más alto posible, es decir, sería fantástico si pudiera decir algo como, por ejemplo, "Quiero hacer un corte en los bordes e1, e2, e4".

¿Algunas ideas?

Respuesta1

Me temo que no entiendo correctamente tu pregunta. De todos modos, vea si la siguiente solución da un resultado que al menos en una parte se acerque a lo que le gustaría tener:

ingrese la descripción de la imagen aquí

Reescribí completamente tu código, sin embargo, aún puedes restaurar partes que debido a un malentendido de tu pregunta omití:

\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 puede ver, uso la biblioteca TikZ quoetespara etiquetar bordes entre nodos. Para los "cortes" utilizo líneas discontinuas, pero es fácil cambiarlas a líneas continuas. Si algunos cortes tuvieran que hacerse por líneas rectas, esto no debería ser difícil añadiendo o eliminando los sobrantes con trazos.

información relacionada