Нарисуйте стрелки от нескольких узлов к одному и соедините их общей линией.

Нарисуйте стрелки от нескольких узлов к одному и соедините их общей линией.

У меня есть несколько блоков, которые должны быть соединены с «базовым» блоком, как на диаграмме UML, с помощью стрелки «extends» (я создал этот пример, просто нарисовав его без TeX):

пример

Я пытаюсь сделать это, используя этот код с |-общей линией для стрелок и (270:10mm)переместить ее вниз 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}

но у меня получается такая картина:

результат

Как правильно соединить несколько стрелок общей линией? Скорее всего, мне нужно будет изменить количество блоков и их положение, поэтому фиксированные или жестко заданные координаты линии мне не подойдут.

решение1

Я бы сделал так, с arrowsбиблиотекой TikZ.

введите описание изображения здесь

\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}

Редактировать:Это не большая проблема, но если вы увеличите масштаб стрелки, то увидите, что соединения, идущие от левого и правого узлов (на котором нет стрелки), изменяют визуальный вид кончика стрелки. Смотрите ниже.

введите описание изображения здесьвведите описание изображения здесь

Поэтому в этом случае просто сдвиньте немного вниз конечную точку соединений ([yshift=-1pt]base.south), например, так, чтобы край не касался рамки, а наконечник стрелы стал острее.

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

решение2

Вот что я предлагаю. Узел nформы coordinateопределяется «на перекрестке», чтобы сделать код легко читаемым. Специальная стрелка сделана следующим стилем, который опирается на arrows.metaTiкБиблиотека Z:

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

Обратите внимание, что это \tikzstyleустарело. Используйте block/.style={...}для определения blockстиля (см. ниже). outer sep=0в моем blockстиле гарантирует, что соединительные линии не останавливаются перед границей прямоугольника. Я удалил опцию, autoпотому что она здесь не используется.

\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}

введите описание изображения здесь

решение3

Ваша диаграмма оставляет меня на дереве с противоположным направлением стрелки:

введите описание изображения здесь

Его можно просто нарисовать, используя пакет forestс опцией 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}

Связанный контент