# Transform a shape based on existing coordinates

I want to draw a custom arrow that connects two nodes. Unfortunately, I think this cannot be done with the arrows library:

Tikz provides convenient shapes for such a case, e.g., the signal arrow. But for some reason there appears to be no way to draw it along a path as an edge.

But how would I transform it such that it points from one coordinate to another?

My general idea would be to:

1. Stretch the arrow, i.e. increase the distance between the head and the tail
2. Rotate the arrow such that it actually points towards the target

What is the idiomatic way to stretch (a part of) and rotate an existing shape?

To begin with, I could actually live with only point 1, but it would be important that I do not stretch the tip and tail but only the "middle end".

• Are you aware of \usetikzlibrary{bending}?
– user121799
Mar 13, 2018 at 13:54

Is this what you want?

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

\begin{document}
\begin{tikzpicture}[
myarrow/.style={single arrow, draw, shape border uses incircle}]

\node[draw, minimum width=2cm] (a) {Node A};
\node[draw, minimum width=2cm, below=2cm of a] (b) {Node B};
\path (a.south west) let \p1 = ($(b.north)-(a.south west)$) in
node[myarrow, minimum height={veclen(\x1,\y1)}, shape border rotate={atan2(\y1,\x1)}, anchor=tail] {};

\node[draw, minimum width=2cm, above right=1cm and 2cm of a] (c) {Node C};

\path (b.north east) let \p1 = ($(c.south)-(b.north east)$) in
node[myarrow, minimum height={veclen(\x1,\y1)}, shape border rotate={atan2(\y1,\x1)}, anchor=tail] {};
\end{tikzpicture}
\end{document}


\documentclass[tikz,border=3pt]{standalone}
\usetikzlibrary{positioning, shapes.arrows, calc,bending,arrows.meta}

\begin{document}
\begin{tikzpicture}

\node[draw, minimum width=2cm] (A) {A};
\node[draw, minimum width=2cm, below=2cm of A] (B) {B};
\draw[-{Implies[bend]},double distance=5pt] (A.-160) to[out=-90,in=90]
(B.north);

\end{tikzpicture}
\end{document}