我想使用箭头连接一个矩形和圆形节点,如下图(右图)所示。
问题是我必须指定非常任意的坐标(例如下面代码中的 -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
)。我附上了您的图片以供比较。
答案2
这确实是比较特殊的关系,不太容易处理。
如果这些连接仅用于将圆与直线连接起来,则可以使用intersection cs
(或其隐式变体intersection of
)。当然,您也可以使用intersections
库,但您需要命名路径,并且这些路径必须实际相交。
(由于圆与线之间相交计算的实现存在错误,因此无法使用第二种解决方案(solution=2
或intersection 2 of
)。但可以使用线的方向来实现这一点(在我们的例子中,只需使用y shift=-1
)。)
我还使用节点作为矩形部分,Rectangle=<width>x<height>
键用于添加具有 xy 坐标系尺寸的矩形。(对于circle
s,可以做类似的事情,例如使用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
。我将箭头涂成红色,以便您能看见它。
顺便说一句,如果可能的话,请使用包含矩形的节点。使用节点会容易得多,因为我可以只使用矩形节点,而不必定义新的坐标。
输出
代码
\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}