Zeichnen Sie Pfeile von mehreren Knoten zu einem und verbinden Sie diese mit einer gemeinsamen Linie

Zeichnen Sie Pfeile von mehreren Knoten zu einem und verbinden Sie diese mit einer gemeinsamen Linie

Ich habe mehrere Blöcke, die wie im UML-Diagramm mit dem „Erweitert“-Pfeil mit dem „Basis“-Block verbunden werden sollten (ich habe dieses Beispiel nur durch Zeichnen ohne TeX erstellt):

Beispiel

Ich versuche, dies mit diesem Code zu tun, indem ich |-eine gemeinsame Linie für Pfeile verwende und (270:10mm)sie nach unten verschiebe für 10mm:

\tikzset{node distance=1.6cm, auto, every text node part/.style={align=center, font={\sffamily\small}}}
\tikzstyle{block} = [draw=myblack, fill=white, inner sep=0.3cm, outer sep=0.1cm, thick]

\begin{tikzpicture}
  \node[block] (base) {Base};
  \node[block, below=of base] (impl2) {Impl2};
  \node[block, left=of impl2] (impl1) {Impl1};
  \node[block, right=of impl2] (impl3) {Impl3};
  \draw[->] (impl1.north) |- (270:10mm) --++ (base.south);
  \draw[->] (impl2.north) |- (270:10mm) --++ (base.south);
  \draw[->] (impl3.north) |- (270:10mm) --++ (base.south);
\end{tikzpicture}

aber ich bekomme dieses Bild angezeigt:

Ergebnis

Wie verbinde ich mehrere Pfeile richtig mit einer gemeinsamen Linie? Höchstwahrscheinlich muss ich die Anzahl der Blöcke und ihre Position ändern, daher funktionieren feste oder hartcodierte Linienkoordinaten für mich nicht.

Antwort1

Ich würde es so machen, mit arrowsder TikZ-Bibliothek.

Bildbeschreibung hier eingeben

\documentclass[border=1mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{chains,arrows}
\tikzset{
  node distance=1.6cm,
  auto,
  every text node part/.style={
    align=center,
    font={\sffamily\small},
  }
}
\tikzstyle{block}=[
  draw=black,
  fill=white,
  inner sep=0.3cm,
  outer sep=0cm,
  thick,
]

\begin{document}
\begin{tikzpicture}
  \node[block] (base) {Base};
  \node[block, below=of base]  (impl2) {Impl2};
  \node[block, left= of impl2] (impl1) {Impl1};
  \node[block, right=of impl2] (impl3) {Impl3};
  \draw (impl1.north) |- (270:10mm) -|  (base.south);
  \draw[-latex] (impl2.north) --  (base.south);
  \draw (impl3.north) |- (270:10mm)  -| (base.south);
\end{tikzpicture}
\end{document}

Bearbeiten:Es ist kein großes Problem, aber wenn Sie den Pfeil vergrößern, werden Sie sehen, dass die Verbindungen von den linken und rechten Knoten (die keinen Pfeil haben) die Darstellung der Pfeilspitze verändern. Siehe unten.

Bildbeschreibung hier eingebenBildbeschreibung hier eingeben

Verschiebe in diesem Fall einfach die Endpunkte der Verbindungen beispielsweise mit etwas nach unten ([yshift=-1pt]base.south), damit die Kante den Rahmen nicht berührt und die Pfeilspitze schärfer wird.

  \draw (impl1.north) |- (270:10mm) -|  ([yshift=-1pt]base.south);
  \draw[-latex] (impl2.north) --  (base.south);
  \draw (impl3.north) |- (270:10mm)  -| ([yshift=-1pt]base.south);

Antwort2

Hier ist mein Vorschlag. Ein Knoten nder Form coordinate„an der Kreuzung“ wird definiert, um den Code leicht lesbar zu machen. Der spezielle Pfeil wird mit dem folgenden Stil erstellt, der auf dem arrows.metaTi basiertkZ-Bibliothek:

extends/.style={->, >={Triangle[open, width=0.2cm, length=0.2cm]}}

Beachten Sie, dass dies \tikzstyleveraltet ist. Verwenden Sie es, block/.style={...}um den blockStil zu definieren (siehe unten). outer sep=0In meinem blockStil wird sichergestellt, dass Verbindungslinien nicht vor dem Rechteckrand enden. Ich habe die Option entfernt, autoda sie hier nicht verwendet wird.

\documentclass[tikz, border=2mm]{standalone}
\usetikzlibrary{arrows.meta, positioning}

\begin{document}

\begin{tikzpicture}[
  node distance=1.6cm,
  every text node part/.style={align=center, font={\sffamily\small}},
  block/.style={draw=black, fill=white, inner sep=0.3cm, outer sep=0, thick},
  extends/.style={->, >={Triangle[open, width=0.2cm, length=0.2cm]}},
  ]
  \node[block] (base) {Base} coordinate[below=0.7cm of base.south] (n);
  \node[block, below=of base] (impl2) {Impl2};
  \node[block, left=of impl2] (impl1) {Impl1};
  \node[block, right=of impl2] (impl3) {Impl3};

  \draw (impl1.north) |- (n);
  \draw (impl2.north) |- (n);
  \draw (impl3.north) |- (n);
  \draw[extends] (n) -- (base.south);
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Antwort3

Ihr Diagramm lässt mich an einem Baum mit entgegengesetzter Pfeilrichtung hängen:

Bildbeschreibung hier eingeben

Es kann einfach durch Verwendung des forestPakets mit der Option gezeichnet werden forked edge:

\documentclass[margin=3mm]{standalone}
\usepackage[edges]{forest}
\usetikzlibrary{arrows.meta}

\begin{document}
    \begin{forest}
for tree = {
% nodes
    draw,
    inner sep = 3mm,
    font = \sffamily\small,
% tree
   forked edge,
   l sep = 12mm,   % vertical distances between nodes
fork sep = 6mm,    % distances to connection point
   s sep = 12mm,   % horizontal distances between nodes
edge ={Stealth-}
           }% end for tree
[Base
    [Impl1]
    [Impl2]
    [Impl3]
]
    \end{forest}
\end{document}

verwandte Informationen