To be very precise, the curvature added to the line with bend
doesn't exactly make it an arc. Or rather it looks like an arc, but mathematically speaking it is not one (it is a Bézier curve if I'm not mistaken). Hence, when shortened the way you did in the example, it will be a bit, well... different. I think shorten
was implemented with really short distances in mind, little adjustments, where the difference between the original curve and the correction is (almost) imperceptible.
Beside the solution by @Jan Hlavacek, you could try the following two.
One thing is to explicitly draw a Bézier (with controls
) and play around with the control points, but that can be a lot of guesswork. Instead you could try playing either with the <angle>
option bend
takes (see code below) - not perfect, but satisfactory, I believe - or draw a curve between the endpoints (n1
and n2
in your case) and make visible only part of it (see also below):
\begin{tikzpicture}
\node[] (n1) at (0,0) {1};
\node[] (n2) at (4,0) {2};
\draw[->] (n1) to [bend left] (n2); % original arc
% solution 1
\draw[->, blue, shorten >=1cm] (n1) to [bend left=27] (n2);
% solution 2
\pgfpathcurvebetweentime{0.05}{0.75}{\pgfpoint{0}{0}}{\pgfpointxy{1}{0.9}}{\pgfpointxy{3}{0.9}}{\pgfpointxy{4}{0}}
\pgfsetarrowsend{to}
\pgfsetstrokecolor{red}
\pgfusepath{stroke}
\end{tikzpicture}
The \pgfpathcurvebetweentime
takes the parameters: visible part beginning at portion <start>
of curve, visible part ending at portion <end>
of curve, start of actual curve, control point 1, control point 2, end of actual curve. As you can see, this is also a Bézier curve, but since all arcs can be modeled as Béziers, the resulting curve will also look good. In any cas, you must probably fiddle a bit with the controls coordinates, but this could be calculated and also, the coordinates of the nodes could be extracted to make the result more generic.
shorten >
option cannot be applied to a subpath, only to the whole path, so in your example, it gets ignored. What you probably want to do is\draw[->, shorten >=1cm] (n1) to [bend left] (n2);
.