컷이 있는 방향 그래프

컷이 있는 방향 그래프

나는 tikz를 사용하여 방향성 그래프를 조판하려고 합니다.

이것이 내가 지금까지 얻은 것입니다:

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

결과는 거의 괜찮습니다.

그러나 개선의 여지가 있습니다.

  • 어쩐지 한 컷에는 날카로운 굴곡이 있다. 나는 이것을 사용하여 이것을 피할 수 있다는 것을 깨달았습니다 net cross/.style = {}. 그러나 교차점이 가장자리의 중간에 있으므로 나는 그것을 원하지 않습니다.

  • 절단면이 90도 각도로 교차하면 좋을 것 같습니다. 나는 이미 십자가를 만들고 with 및 을 sloped사용하여 시도했지만 노드나 좌표 방향을 기준으로 각도를 지정할 수 없는 것 같습니다.drawtoinout

그래프 코드를 가능한 한 높은 수준으로 유지하고 싶습니다. 즉, "모서리 e1, e2, e4를 가로질러 절단을 만들고 싶습니다"와 같이 말할 수 있다면 좋을 것입니다.

어떤 아이디어가 있나요?

답변1

귀하의 질문을 올바르게 이해하지 못하는 것 같습니다. 어쨌든, 다음 솔루션이 적어도 원하는 부분에 가까운 결과를 제공하는지 확인하십시오.

여기에 이미지 설명을 입력하세요

나는 귀하의 코드를 완전히 다시 작성했지만 귀하의 질문에 대한 오해로 인해 생략된 부분을 여전히 복원할 수 있습니다.

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

보시다시피 저는 quoetes노드 사이의 가장자리에 레이블을 지정하기 위해 TikZ 라이브러리를 사용합니다. "컷"의 경우 점선을 사용하지만 실선으로 바꾸는 것은 간단합니다. 일부 절단을 직선으로 수행해야 하는 경우 잉여 점선을 추가하거나 삭제하는 것이 어렵지 않습니다.

관련 정보