Como obter linhas retangulares entre nós com tikz?

Como obter linhas retangulares entre nós com tikz?

Desculpe se estiver duplicado (tenho certeza que duplicado), mas realmente não consigo encontrar uma maneira de fazer isso manualmente. Eu criei a próxima cadeia de blocos.

insira a descrição da imagem aqui

Aqui você pode ver a linha curva entre o último e o terceiro bloco. Mas eu quero algo assim:insira a descrição da imagem aqui

E a pergunta: como posso conectá-los desta forma? Tenho certeza de que é bem simples. MWE:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning,automata}

\begin{document}
\begin{tikzpicture}
\node[draw, thick, rectangle] (0) {Data arrival};
\node[draw, thick, rectangle, below of=0] (1) {Coks backoff procedure};
\node[draw, thick, rectangle, below of= 1] (2) {Get trigger-frame?};
\node[draw, thick, rectangle, below of= 2] (3) {Performs backoff procedure};
\node[draw, thick, shape aspect=2.7, diamond, below =0.5cm of 3] (4) {$b<0$?};

 \path[>=latex, auto = right,every loop]

(0) edge[] node {} (1)
(1) edge node {} (2)
(2) edge node {} (3)
(3) edge node {} (4)
(4.east) edge[in=0, out=0, looseness=3] node[right] {N} (2.east)
;     
\end{tikzpicture}
\end{document}

Responder1

O código abaixo usa as seguintes construções de caminho. Existem muitos mais, consulte o manual do tikz ou qualquer um dosos muitos exemplos na internet).

  • (a) -- (b)descreve um caminho direto de apara b.

  • (a) -| (b)descreve um caminho de aaté b, primeiro horizontalmente até estar abaixo ou acima be depois verticalmente.

  • (a) |- (b)é o mesmo, mas começando verticalmente e continuando horizontalmente.

  • ++(1,-2)denota uma posição relativa à anterior, 1 unidade para a direita e 2 unidades para baixo. O mesmo (a) -| ++(1,-2)acontece com um caminho que começa em a, indo 1 unidade para a direita e 2 unidades para baixo. Como efeito colateral, a nova posição inicial foi movida para o final do caminho. Então

    \draw (a) -| ++(1,-2) -| ++(-1,2);
    

    desenha um retângulo com a posição final novamente em a.

  • +(1,-2)é basicamente o mesmo que ++(1,-2), exceto que a posição não se move.

    \draw (a) -| +(1,-2) -| +(-1,2);
    

    desenha duas linhas com um ângulo cada, uma à direita ae outra à esquerda de a.

insira a descrição da imagem aqui

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning,automata}

\begin{document}
\begin{tikzpicture}
  [>=latex,
   action/.style={draw,thick},
   test/.style={draw, thick, shape aspect=2.7, diamond}
  ]
\node[action] (0) {Data arrival};
\node[action, below=of 0] (1) {Coks backoff procedure};
\node[action, below=of 1] (2) {Get trigger-frame?};
\node[action, below=of 2] (3) {Performs backoff procedure};
\node[test, below= 0.5cm of 3] (4) {$b<0$?};
\node[action, left=of 3] (5) {Do something};
\path[->]
  (0) edge node {} (1)
  (1) edge node {} (2)
  (2) edge node {} (3)
  (3) edge node {} (4);
\draw[->] (4) -- node[below right,pos=0.2]{N} ++(3,0) |- (2);     
\draw[->] (4) -| node[below left,pos=0.1]{Y} (5);
\draw[->] (5) |- (2); 
\draw[->] (4) --node[right] {maybe} +(0,-1.5);     
\end{tikzpicture}
\end{document}

Responder2

Ligeiramente modificadoGernotresposta (para alegria e exercício):

\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{arrows, chains, positioning, shapes}% added chains
\makeatletter
\tikzset{supress chain/.code={\def\tikz@after@path{}}}% added for suppress joining of nodes
\makeatother

\begin{document}
\begin{tikzpicture}[
            > = latex,
node distance = 5mm and 7mm,% added (not used default value)
  start chain = going below,% activation of chains
action/.style = {draw, thick, on chain, join= by ->},% nodes are in chain and connected by ->
  test/.style = {diamond, draw, thick, shape aspect=2.4, on chain, join= by ->}% node is in the chain and connected by -> with previous node
  ]
\node[action]   (n0) {Data arrival};
\node[action]   (n1) {Coks backoff procedure};
\node[action]   (n2) {Get trigger-frame?};
\node[action]   (n3) {Performs backoff procedure};
\node[test]     (n4) {$b<0$?};
\node[action, 
      supress chain, % this node is not connected with join
      left=of n3]   (n5) {Do something};
\draw[->] (n4) -| node[below,pos=0.25] {Y}  (n5); % left feedback loop
\draw[->] (n5) |- (n0); % left feedback loop
\draw[->] (n4) -|  ([xshift=5mm] n3.east) node[below,pos=0.25] {N} |- (n2); % right feedback loop
\draw[->] (n4.south) -- node[right] {maybe} ++ (0,-1.1);
\end{tikzpicture}
\end{document}

Os resultados são quase os mesmos:

insira a descrição da imagem aqui

informação relacionada