使用 Tikz 连接节点而不跨越其他块
connect nodes with Tikz without crossing other blocks
我想在我的代码中连接块B和M,而不需要连接线“切割”F。如何强制连接扩大连接线并避免F?
\documentclass[11pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,shapes.geometric,arrows,positioning,intersections}
\begin{document}
\begin{tikzpicture}[auto,node distance=1cm,thick,
main node/.style={black,draw,minimum width=1.5cm,minimum height=0.75cm}]%circle,draw,font=\sffamily\Large\bfseries}]
\node[main node] (L) {L};
\node[main node] (F) [left = of L ] {F};
\node[main node] (C) [below = of F ] {M};
\node[main node] (B) [right = of L ] {B};
\node[main node] (AP) [below = of B ] {AP};
\node[main node] (A) [below = of L ] {A};
\node[main node] (H) [right = of B ] {H};
\node[main node] (G) [right = of H] {G};
\node[main node] (BR) [below = of G] {BR};
\node[main node] (LR) [below = of BR] {LR};
\node[main node] (U) [below = of AP ] {U};
\node[main node] (P) [below = of U ] {P};
\path[every node/.style={font=\sffamily\small}]
(L) edge node [right] {} (B)
(L) edge node [right] {} (F)
(L) edge node [right] {} (C)
(F) edge node [right] {} (C)
(B.north) edge [out=90,in=90] node [right] {} (F.north)
(B.north) edge [out=90,in=180] node [right] {} (C.west)
(B) edge node [right] {} (AP)
(B) edge node [right] {} (A)
(AP.east) edge [out=0,in=270] node [left] {} (H.south)
(B) edge node [right] {} (H)
(H) edge node [right] {} (G)
(U.east) edge [out=0,in=270] node [left] {} (H.south)
(P.east) edge [out=0,in=270] node [left] {} (H.south)
(U) edge node [right] {} (P)
(BR.west) edge [out=180,in=270] node [right] {} (H.south)
(LR.west) edge [out=180,in=270] node [right] {} (H.south)
(BR.east) edge [out=0,in=0] node [right] {} (G.east)
(LR.east) edge [out=0,in=0] node [right] {} (G.east);
\end{tikzpicture}
\end{document}
这就是我现在得到的
这就是我想要的
谢谢!
在 tikz 中没有直接的方法可以做到这一点,但这可以通过添加中间节点来实现。
这里有两种方法。
第一个(蓝色)使用主路径中的边。由于边只有一个分支,因此在适当的位置创建坐标并在另一条边中重复使用。
第二种方式(红色)使用带有多个中间节点的常规 tikz 线。如果需要,它更灵活,可以有任意数量的中间节点。
应调整中间节点的位置以达到预期效果。
\documentclass[11pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,shapes.geometric,arrows,positioning,intersections}
\begin{document}
\begin{tikzpicture}[auto,node distance=1cm,thick,
main node/.style={black,draw,minimum width=1.5cm,minimum height=0.75cm}]%circle,draw,font=\sffamily\Large\bfseries}]
\node[main node] (L) {L};
\node[main node] (F) [left = of L ] {F};
\node[main node] (C) [below = of F ] {M};
\node[main node] (B) [right = of L ] {B};
\node[main node] (AP) [below = of B ] {AP};
\node[main node] (A) [below = of L ] {A};
\node[main node] (H) [right = of B ] {H};
\node[main node] (G) [right = of H] {G};
\node[main node] (BR) [below = of G] {BR};
\node[main node] (LR) [below = of BR] {LR};
\node[main node] (U) [below = of AP ] {U};
\node[main node] (P) [below = of U ] {P};
\path[every node/.style={font=\sffamily\small}]
(L) edge node [right] {} (B)
(L) edge node [right] {} (F)
(L) edge node [right] {} (C)
(F) edge node [right] {} (C)
(B.north) edge [out=90,in=90] node [right] {} (F.north)
%%%% (B.north) edge [out=90,in=180] node [right] {} (C.west)
%west_of_F is an intermediate node to allow a proper connection of B and C
(B.north) edge [blue,out=90,in=90] coordinate[at end] (west_of_F) ($(F.west)+(-1cm,0)$)
(west_of_F) edge [blue, out=-90,in=180] (C.west)
(B) edge node [right] {} (AP)
(B) edge node [right] {} (A)
(AP.east) edge [out=0,in=270] node [left] {} (H.south)
(B) edge node [right] {} (H)
(H) edge node [right] {} (G)
(U.east) edge [out=0,in=270] node [left] {} (H.south)
(P.east) edge [out=0,in=270] node [left] {} (H.south)
(U) edge node [right] {} (P)
(BR.west) edge [out=180,in=270] node [right] {} (H.south)
(LR.west) edge [out=180,in=270] node [right] {} (H.south)
(BR.east) edge [out=0,in=0] node [right] {} (G.east)
(LR.east) edge [out=0,in=0] node [right] {} (G.east);
\draw[red] (B.north) to[out=90,in=0] ($(B.north)+(-3cm,2cm)$)
to [out=180,in=90] ($(C.west)+(-1.1cm,2cm)$)
to [out=-90,in=180] (C.west);
\end{tikzpicture}
\end{document}
我想在我的代码中连接块B和M,而不需要连接线“切割”F。如何强制连接扩大连接线并避免F?
\documentclass[11pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,shapes.geometric,arrows,positioning,intersections}
\begin{document}
\begin{tikzpicture}[auto,node distance=1cm,thick,
main node/.style={black,draw,minimum width=1.5cm,minimum height=0.75cm}]%circle,draw,font=\sffamily\Large\bfseries}]
\node[main node] (L) {L};
\node[main node] (F) [left = of L ] {F};
\node[main node] (C) [below = of F ] {M};
\node[main node] (B) [right = of L ] {B};
\node[main node] (AP) [below = of B ] {AP};
\node[main node] (A) [below = of L ] {A};
\node[main node] (H) [right = of B ] {H};
\node[main node] (G) [right = of H] {G};
\node[main node] (BR) [below = of G] {BR};
\node[main node] (LR) [below = of BR] {LR};
\node[main node] (U) [below = of AP ] {U};
\node[main node] (P) [below = of U ] {P};
\path[every node/.style={font=\sffamily\small}]
(L) edge node [right] {} (B)
(L) edge node [right] {} (F)
(L) edge node [right] {} (C)
(F) edge node [right] {} (C)
(B.north) edge [out=90,in=90] node [right] {} (F.north)
(B.north) edge [out=90,in=180] node [right] {} (C.west)
(B) edge node [right] {} (AP)
(B) edge node [right] {} (A)
(AP.east) edge [out=0,in=270] node [left] {} (H.south)
(B) edge node [right] {} (H)
(H) edge node [right] {} (G)
(U.east) edge [out=0,in=270] node [left] {} (H.south)
(P.east) edge [out=0,in=270] node [left] {} (H.south)
(U) edge node [right] {} (P)
(BR.west) edge [out=180,in=270] node [right] {} (H.south)
(LR.west) edge [out=180,in=270] node [right] {} (H.south)
(BR.east) edge [out=0,in=0] node [right] {} (G.east)
(LR.east) edge [out=0,in=0] node [right] {} (G.east);
\end{tikzpicture}
\end{document}
这就是我现在得到的
这就是我想要的
谢谢!
在 tikz 中没有直接的方法可以做到这一点,但这可以通过添加中间节点来实现。 这里有两种方法。
第一个(蓝色)使用主路径中的边。由于边只有一个分支,因此在适当的位置创建坐标并在另一条边中重复使用。
第二种方式(红色)使用带有多个中间节点的常规 tikz 线。如果需要,它更灵活,可以有任意数量的中间节点。
应调整中间节点的位置以达到预期效果。
\documentclass[11pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,shapes.geometric,arrows,positioning,intersections}
\begin{document}
\begin{tikzpicture}[auto,node distance=1cm,thick,
main node/.style={black,draw,minimum width=1.5cm,minimum height=0.75cm}]%circle,draw,font=\sffamily\Large\bfseries}]
\node[main node] (L) {L};
\node[main node] (F) [left = of L ] {F};
\node[main node] (C) [below = of F ] {M};
\node[main node] (B) [right = of L ] {B};
\node[main node] (AP) [below = of B ] {AP};
\node[main node] (A) [below = of L ] {A};
\node[main node] (H) [right = of B ] {H};
\node[main node] (G) [right = of H] {G};
\node[main node] (BR) [below = of G] {BR};
\node[main node] (LR) [below = of BR] {LR};
\node[main node] (U) [below = of AP ] {U};
\node[main node] (P) [below = of U ] {P};
\path[every node/.style={font=\sffamily\small}]
(L) edge node [right] {} (B)
(L) edge node [right] {} (F)
(L) edge node [right] {} (C)
(F) edge node [right] {} (C)
(B.north) edge [out=90,in=90] node [right] {} (F.north)
%%%% (B.north) edge [out=90,in=180] node [right] {} (C.west)
%west_of_F is an intermediate node to allow a proper connection of B and C
(B.north) edge [blue,out=90,in=90] coordinate[at end] (west_of_F) ($(F.west)+(-1cm,0)$)
(west_of_F) edge [blue, out=-90,in=180] (C.west)
(B) edge node [right] {} (AP)
(B) edge node [right] {} (A)
(AP.east) edge [out=0,in=270] node [left] {} (H.south)
(B) edge node [right] {} (H)
(H) edge node [right] {} (G)
(U.east) edge [out=0,in=270] node [left] {} (H.south)
(P.east) edge [out=0,in=270] node [left] {} (H.south)
(U) edge node [right] {} (P)
(BR.west) edge [out=180,in=270] node [right] {} (H.south)
(LR.west) edge [out=180,in=270] node [right] {} (H.south)
(BR.east) edge [out=0,in=0] node [right] {} (G.east)
(LR.east) edge [out=0,in=0] node [right] {} (G.east);
\draw[red] (B.north) to[out=90,in=0] ($(B.north)+(-3cm,2cm)$)
to [out=180,in=90] ($(C.west)+(-1.1cm,2cm)$)
to [out=-90,in=180] (C.west);
\end{tikzpicture}
\end{document}