如何根據兩個節點的位置決定第三個節點的位置?

如何根據兩個節點的位置決定第三個節點的位置?

這是我現有程式碼產生的圖像: 1 我希望菱形的FFFFF可以在C的正上方,E的正右邊,該怎麼辦?以下是我的最小工作案例:

\documentclass[tikz,border=2pt]{standalone} 
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{shapes,snakes}
\usepackage{siunitx} %SI单位
%\usepackage{xparse}
\usetikzlibrary{positioning}


\begin{document}
    \begin{tikzpicture}
    
    \node[rectangle,draw, very thick, minimum size=10mm] (A) {
    A};
    \node[rectangle,draw, very thick, minimum size=10mm] (B) [below=of A]{B};
    \node[rectangle,draw=red, very thick, minimum size=10mm] (C) [right=of B]{C};
    \node[rectangle,draw, very thick, minimum size=10mm] (D) [right=of C]{D};
    \node[rectangle,draw, very thick, minimum size=10mm] (E) [above=of D] {E};
    \node[diamond,draw, very thick, minimum size=10mm] (F) [above=of C] {FFFFFfF};
    
        %Lines
    \draw[->] (A) -> (B);
    \draw[->] (B) -> (C);
    \draw[->] (C) -> (D);
    \draw[->] (D) -> (E);
    \draw[->] (E) -> (F);
    \draw[->] (F) -> (C);
    \end{tikzpicture}
\end{document}

而我最終希望得到的是這個,那就是我需要添加一個非常大的虛線框。這應該如何實現呢? 2

答案1

您需要選項on grid=true,它將使用節點中心(而不是它們的邊界)進行定位。但隨後你將需要增加node distance

對於虛線框,我建議使用該fit庫。

在此輸入影像描述

\documentclass{article} 
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{shapes,snakes}
\usepackage{siunitx} %SI单位
%\usepackage{xparse}
\usetikzlibrary{positioning, fit}


\begin{document}
    \begin{tikzpicture}[on grid=true, node distance=3cm]
    
    \node[rectangle,draw, very thick, minimum size=10mm] (A) {
    A};
    \node[rectangle,draw, very thick, minimum size=10mm] (B) [below=of A]{B};
    \node[rectangle,draw=red, very thick, minimum size=10mm] (C) [right=of B]{C};
    \node[rectangle,draw, very thick, minimum size=10mm] (D) [right=of C]{D};
    \node[rectangle,draw, very thick, minimum size=10mm] (E) [above=of D] {E};
    \node[diamond,draw, very thick, minimum size=10mm] (F) [above=of C] {FFFFFfF};
    
        %Lines
    \draw[->] (A) -> (B);
    \draw[->] (B) -> (C);
    \draw[->] (C) -> (D);
    \draw[->] (D) -> (E);
    \draw[->] (E) -> (F);
    \draw[->] (F) -> (C);
    \node[draw, dashed, fit = {(B)(D)}, text height=2cm]{for $i=1,2,\dots,N$};
    \end{tikzpicture}
\end{document}

答案2

  • 您可以先在選項中定義節點和邊緣樣式tikzpicture,然後編寫圖像的簡短程式碼。
  • 虛線矩形被繪製為節點,它適合節點 B ... D:
\documentclass[border=3.141592]{standalone}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,  % new
                fit,          % new
                positioning,
                shapes}


\begin{document}
    \begin{tikzpicture}[% nodes, edges styles
node distance = 10mm and 10mm,
D/.style = {diamond, aspect=1.3, 
            inner xsep=0mm, draw, thick}, 
F/.style = {draw, dashed, inner ysep=3ex, yshift=-1ex,
            fit=#1},
N/.style = {draw=#1, thick, minimum size=10mm},
N/.default = black,
every edge/.append style = {draw, -Straight Barb}
                      ]
\node (A) [N]               {A};
\node (B) [N, below=of A]   {B};
\node (C) [N=red, 
              right=of B]   {C};
\node (D) [N, right=of C]   {D};
\node (E) [N, above=of D]   {E};
\path (E) -- node (F) [D] {FFFFFfF} (A);    % <---
% dashed rectangle
\node[F=(B) (D), 
      label={[anchor=south]below:{for $i=1,2,\dotsc,N$}}] {};
% arrows
\draw   (A) edge (B) 
        (B) edge (C)
        (C) edge (D) 
        (D) edge (E) 
        (E) edge (F) 
        (F) edge (C);
    \end{tikzpicture}
\end{document}

在此輸入影像描述

答案3

您可以將節點 F 放置在十字路口穿過 的垂直線和穿過或 的C水平線:AE

\node[diamond] (F) at (C|-E) {FFFFFfF};

使用calc庫,您可以將其放置在 (中心)A和之間E

\node[diamnond] (F) at ($(A)!.5!(E)$) {FFFFFfF};

或沿路徑的節點的邊界A和節點之間的中間位置:E

\path (A) -- node[diamond] (F) {FFFFFfF} (E);

不過,在後者中,您也可以使用A.centerand E.center,在前者中,您可以使用($(A.east)!.5!(E.west)$),但由於您的節點AE具有相同的寬度,因此將節點放置在它們的中心之間的中間和它們的邊界之間的中間沒有什麼不同。

當然,在所有這些情況下,node distance將不再被觀察到,但對於F節點來說已經太晚了。


您可以使用on grid選項positioning,以便測量節點中心之間的節點距離,這需要您仔細設定適當的節點距離。 (→桑迪·G 的回答


您可以將節點放置在 中,matrix of nodes這會將它們放置在網格上,但會確保它們之間觀察到由row sep和表示的最小節點距離column sep。透過使用關鍵字between originsrow sep/或column sep類似的定位演算法作為on grid選項可以用於矩陣。

\matrix[
  matrix of nodes,
  row sep=1cm,
  column sep=1cm,
  cells={nodes={draw, very thick, minimum size=10mm}}]{
|(A)| A & |[diamond]  (F)| FFFFFfF & |(E)| E \\
|(B)| B & |[draw=red] (C)| C       & |(D)| D \\};

程式碼

\documentclass[tikz,border=2pt]{standalone}
\usetikzlibrary{fit, graphs, matrix, positioning, shapes.geometric}
\begin{document}
\begin{tikzpicture}
\begin{scope}[nodes={draw, very thick, minimum size=10mm}]
\node           (A)              {A};
\node           (B) [below=of A] {B};
\node[draw=red] (C) [right=of B] {C};
\node           (D) [right=of C] {D};
\node           (E) [above=of D] {E};
\node[diamond]  (F) at (C|-E)    {FFFFFfF};
% with calc
% \node[diamnond]  (F) at ($(A)!.5!(E)$) {FFFFFfF};
% or without
% \path (A) -- node[diamond] (F) {FFFFFfF} (E);
\end{scope}
\graph[path, ->, use existing nodes] {A, B, C, D, E, F -> C};

\node[
  fit={(B)(D)([yshift=+-1em]C.south)}, dashed, inner sep=+.5em, thick, draw,
  label={[above, inner sep=+.2em]south:for $i = 1, 2, \dots, N$}]{};
\end{tikzpicture}

\begin{tikzpicture}
\matrix[
  matrix of nodes,
  row sep=1cm,
  column sep=1cm,
  cells={nodes={draw, very thick, minimum size=10mm}}]{
|(A)| A & |[diamond]  (F)| FFFFFfF & |(E)| E \\
|(B)| B & |[draw=red] (C)| C       & |(D)| D \\};
\graph[path, ->, use existing nodes] {A, B, C, D, E, F -> C};

\node[
  fit={(B)(D)([yshift=+-1em]C.south)}, dashed, inner sep=+.5em, thick, draw,
  label={[above, inner sep=+.2em]south:for $i = 1, 2, \dots, N$}]{};
\end{tikzpicture}
\end{document}

輸出

在此輸入影像描述 在此輸入影像描述

相關內容