与节点的特殊连接(TikZ)

与节点的特殊连接(TikZ)

我想使用箭头连接一个矩形和圆形节点,如下图(右图)所示。

enter image description here

问题是我必须指定非常任意的坐标(例如下面代码中的 -2.97),以便箭头尖端处于正确的高度。这就是为什么我想使用节点将箭头尖端连接到圆圈的原因。然而,我得到的是上图左侧显示的内容...如何在不手动指定高度的情况下获得所需的结果(右侧)?

\documentclass{article}

\usepackage[letterpaper,textwidth=8.5in,textheight=11in]{geometry}
\usepackage{lscape}

\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{fadings}

\begin{document}
\pagestyle{empty}
\begin{landscape}
\begin{figure}
\centering
\begin{tikzpicture}[scale=1]

\coordinate(A) at (1.5,4);
\coordinate(B) at (2,0.5);
\coordinate(C) at (8,0.5);

\node (C1) at (B) [circle, inner sep=5pt, draw, thick, fill=white] {};
\node (C2) at (C) [circle, inner sep=5pt, draw, thick, fill=white] {};

\foreach \x in {0,1}
\draw [thick, fill=white] ([shift=(A)]6*\x,0) rectangle +(1,-0.35); 

\draw [thick, -{Stealth[length=8pt, width=8pt, inset=2pt]}] (A) ++(0.3,-0.35) -- (C1);
\draw [thick, -{Stealth[length=8pt, width=8pt, inset=2pt]}] (7.5,4) ++(0.3,-0.35) -- +(0,-2.97);

\end{tikzpicture}
\end{figure}
\end{landscape}
\end{document}

答案1

另一个解决方案是使用矩形节点(以及快速而粗糙的填充=白色)。不过,Alenanno 的解决方案更接近您的原始代码,因此它可能更有用。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,fadings}
\begin{document}
\begin{tikzpicture}
\coordinate(A) at (1.5,4);
\coordinate(B) at (2,0.5);
\coordinate(C) at (8,0.5);
\node (C2) at (C) [circle, inner sep=5pt, draw, thick, fill=white] {};
\draw [thick, fill=white] ([shift=(A)]6,0) rectangle +(1,-0.35); 
\draw [thick, -{Stealth[length=8pt, width=8pt, inset=2pt]}] (7.5,4) ++(0.3,-0.35) -- +(0,-2.97);
\end{tikzpicture}
\begin{tikzpicture}
\node[rectangle,thick,minimum width=1cm,minimum height=.35cm,draw=black] (B) at (0,4) {};
\node[yshift=-3.5cm] (C1) at (B) [circle, inner sep=5pt, draw, thick, fill=white] {};
\draw [thick, -{Stealth[length=8pt, width=8pt, inset=2pt]}] (B)  -| (C1.north west); 
\node[rectangle,thick,fill=white,minimum width=1cm,minimum height=.35cm,draw=black] (B) at (0,4) {};
\end{tikzpicture}
\end{document} 

代码创建了两次矩形 B,第二次是为了隐藏部分绘制的箭头(使用fill=white)。我附上了您的图片以供比较。

Left original, right with nodes

答案2

这确实是比较特殊的关系,不太容易处理。

如果这些连接仅用于将圆与直线连接起来,则可以使用intersection cs(或其隐式变体intersection of)。当然,您也可以使用intersections库,但您需要命名路径,并且这些路径必须实际相交。
(由于圆与线之间相交计算的实现存在错误,因此无法使用第二种解决方案(solution=2intersection 2 of)。但可以使用线的方向来实现这一点(在我们的例子中,只需使用y shift=-1)。)

我还使用节点作为矩形部分,Rectangle=<width>x<height>键用于添加具有 xy 坐标系尺寸的矩形。(对于circles,可以做类似的事情,例如使用through库。)

代码

\documentclass[tikz]{standalone}
\usetikzlibrary{arrows.meta,fadings,calc}
\makeatletter
\tikzset{
  Rectangle/.style args={#1x#2}{
    shape=rectangle,
    /utils/exec=\pgfpointxy{#1}{#2},% in TikZ: (#1,#2)
    minimum width/.expanded=\the\pgf@x,
    minimum height/.expanded=\the\pgf@y}}
\makeatother
\tikzset{
 x shift/.style={shift={(0:#1)}},
 y shift/.style={shift={(90:#1)}}}
\begin{document}
\begin{tikzpicture}[
  thick,
  c/.style={circle, inner sep=5pt, draw, node contents=},
  r/.style={Rectangle=1 x .35, draw, anchor=north west, node contents=},
  myTip/.tip={Stealth[length=8pt, width=8pt, inset=2pt]}
 ]
  \node (C1) at (2,.5)  [c]; \node (C2) at (4,.5)    [c];
  \node (R1) at (1.5,4) [r]; \node (R2) at (2+1.5,4) [r];

  \draw[-myTip] ([x shift=.3]R1.south west) coordinate (aux) --
    (intersection of C1 and aux--{[y shift=1]aux});
  \draw[-myTip] ([x shift=.6]R2.south west) coordinate (aux) --
    (intersection cs: first line={(aux)--([y shift=1]aux)}, second node=C2);
\end{tikzpicture}
\end{document}

答案3

F在您的示例中定义了一个新的坐标(A+ 相对坐标),因为如果不像您那样使用相对坐标会更容易,那么您可以使用以下语法。

(F) -- (F|-C1.north);

它的作用是:从 开始F,然后向上移动到C1.north但仍垂直于F。我将箭头涂成红色,以便您能看见它。

顺便说一句,如果可能的话,请使用包含矩形的节点。使用节点会容易得多,因为我可以只使用矩形节点,而不必定义新的坐标。

输出

figure 1

代码

\documentclass{article}
\usepackage[letterpaper,textwidth=8.5in,textheight=11in,landscape]{geometry}
%\usepackage{lscape} % use landscape in the geometry package!
\usepackage{tikz}

\usetikzlibrary{arrows.meta,fadings}

\begin{document}
\pagestyle{empty}
\begin{figure}
\centering
\begin{tikzpicture}[scale=1]

\coordinate(A) at (1.5,4);
\coordinate(B) at (2,0.5);
\coordinate(C) at (8,0.5);
\coordinate(F) at (1.8,3.65);

\node (C1) at (B) [circle, inner sep=5pt, draw, thick, fill=white] {};
\node (C2) at (C) [circle, inner sep=5pt, draw, thick, fill=white] {};

\foreach \x in {0,1}
\draw [thick, fill=white] ([shift=(A)]6*\x,0) rectangle +(1,-0.35); 

\draw [red, thick, -{Stealth[length=8pt, width=8pt, inset=2pt]}] (F) -- (F|-C1.north);
\draw [thick, -{Stealth[length=8pt, width=8pt, inset=2pt]}] (7.5,4) ++(0.3,-0.35) -- +(0,-2.97);

\end{tikzpicture}
\end{figure}
\end{document}

相关内容