但是如果?

但是如果?

通常,在绘制框图时,我想向具有垂直线的节点添加“输入”(如下图所示,用红色绘制)。

有没有一种方法可以不使用 calc 等,以稳健的方式实现这一点?理想情况下,我想使用类似的东西\draw (input) -| (node)

\begin{tikzpicture}
\node[draw,minimum height=4cm,minimum width=1cm] (node) at (0,0) {ABC};
\draw[->] (-2,1) node[anchor=east] {Some input 1} -- (node);
\draw[->,red] (-2,-1) node[anchor=east] {Some input 2} -- +(1.5,0);
\end{tikzpicture}

例子

答案1

您可以使用-||-运算符来形成坐标。在这里,您可以提供通过将包含n.east的节点命名为 来明确指定值。另一种方法是使用路径操作,它会自动设置为操作的起始坐标:Some input 2nto\tikztostartto

\documentclass[tikz, border=2mm]{standalone}

\begin{document}
\begin{tikzpicture}
\node[draw, minimum height=4cm, minimum width=1cm] (node) at (0,0) {ABC};
\draw[->] (-2,1) node[anchor=east] {Some input 1} -- (node);
\draw[->, red] (-2,-1) node[anchor=east] {Some input 2}
  to (\tikztostart -| node.west);
\end{tikzpicture}
\end{document}

在此处输入图片描述

为了回应一些评论,以下内容表明该问题不是用“一般形状”明确定义的:

\documentclass[tikz, border=2mm]{standalone}
\usetikzlibrary{calc, shapes.misc}

\begin{document}
\begin{tikzpicture}
\node[draw, minimum height=2cm,
      rounded rectangle, rounded rectangle west arc=concave] (n) {Some stuff};
\node[circle, inner sep=1.5pt] (foo) at (n.west) {foo};
\draw[red!60!black, ->]
  let \p1=($(n.north)-(n.center)$) in
  (foo) foreach \angle in {-90, -75, ..., 90} { edge +(\angle:\y1) };
\end{tikzpicture}
\end{document}

在此处输入图片描述

但是如果?

那么,你有一个旋转的矩形节点,还想玩吗?TiZcalc库可以正交投影一个点在线上(ab)语法如下($(a)!(p)!(b)$)

\documentclass[tikz, border=1mm]{standalone}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}
\node[draw, rotate=30] (n) {Some stuff};
\node[draw] (foo) at (-1,0.5) {foo bar};
\foreach \anch in {270, 300, 320, 330, 337, 350} {
  \draw[very thin, ->] (foo.\anch)  --
    ($(n.north west)!(foo.\anch)!(n.north east)$);
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

作为对 frougon 非常好的回答的补充,如果你不想使用宏\tikztostart(这是完全没问题的),你也可以命名包含的节点一些输入 2(此处为aux)并在构造相交点 时使用此名称(aux-|node.west)。这在绘制多条折线时有时很有用。

\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
    \begin{tikzpicture}
        \node[draw,minimum height=4cm,minimum width=1cm] (node) at (0,0) {ABC};
        \draw[->] (-2,1) node[anchor=east] {Some input 1} -- (node);
        \draw[->,red] (-2,-1) node[anchor=east] (aux) {Some input 2} -- (aux-|node.west);
    \end{tikzpicture}
\end{document}

输出是一样的。

答案3

这是一个愚蠢的答案:

\documentclass[tikz]{standalone}        
\begin{document}
\begin{tikzpicture}
\node[draw,circle, minimum height=4cm,minimum width=1cm] (node) at (0,0) {ABC};
\draw[<-] (node.120) -- +(-2,0) node[anchor=east] {Some input 1};
\draw[<-] (node.150) -- +(-2,0) node[anchor=east] {Some input 2};
\draw[<-] (node.190) -- +(-2,0) node[anchor=east] {Some input 3};
\draw[<-] (node.240) -- +(-2,0) node[anchor=east] {Some input 4};
\end{tikzpicture}
\end{document}    

输入节点水平指向圆圈

即使“ABC”节点不是矩形,这种方法也是有效的。——但巨大的问题是输入节点的位置不是由明确的坐标设置的。

相关内容