有没有办法结合bend left
和shorten
选项来使弧变短保持其形状否则?
即当我这样做
\begin{tikzpicture}
\node[] (n1) at (0,0) {1};
\node[] (n2) at (4,0) {2};
\draw[->] (n1) to [bend left, shorten >=1cm] (n2);
\draw[->] (n1) to [bend left] (n2); % original arc
\end{tikzpicture}
缩短后的箭头形状与原来的箭头不同。
答案1
准确地说,添加到线条上的曲率bend
并不完全使其成为弧线。或者更确切地说,它看起来就像弧线,但从数学上讲它不是弧线(如果我没记错的话,它是贝塞尔曲线)。因此,当像示例中那样缩短时,它会有点不同。我认为shorten
是在考虑非常短的距离的情况下实现的,几乎没有调整,原始曲线和校正之间的差异(几乎)不可察觉。
除了@Jan Hlavacek 的解决方案之外,您还可以尝试以下两种方法。
一种方法是明确绘制贝塞尔曲线(使用controls
)并尝试控制点,但这可能需要很多猜测。相反,您可以尝试使用<angle>
选项bend
takes(参见下面的代码) - 不完美,但我认为令人满意 - 或者在端点之间绘制一条曲线(在您的例子n1
中n2
)并仅显示其中的一部分(另见下文):
\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}
采用\pgfpathcurvebetweentime
以下参数:可见部分始于<start>
曲线的一部分,可见部分止于<end>
曲线的一部分,实际曲线的起点,控制点 1,控制点 2,实际曲线的终点。如您所见,这也是一条贝塞尔曲线,但由于所有弧线都可以建模为贝塞尔曲线,因此生成的曲线看起来也不错。无论如何,您可能必须稍微摆弄一下控制坐标,但这可以计算出来,而且可以提取节点的坐标以使结果更通用。
答案2
诀窍是加载bending
库 - 现在缩短的箭头将遵循原始路径。要缩短非箭头跟随的原始路径,您需要使用无箭头将其变成箭头,-_
如下所示:
\documentclass[margin=1 cm,tikz]{standalone}
\usetikzlibrary{arrows.meta, bending}
\begin{document}
\begin{tikzpicture}
\begin{tikzpicture}
\node[] (n1) at (0,0) {1};
\node[] (n2) at (4,0) {2};
\draw[->] (n1) to [bend left] (n2); % original arc
\draw[->, red, shorten >=1cm] (n1) to [bend left] (n2); %shortened following original path
\draw[-_, green, shorten >=2cm] (n1) to [bend left] (n2); %shortened following original path without arrow
\end{tikzpicture}
\end{tikzpicture}
\end{document}
答案3
您需要使用in
和out
角度。这似乎对您的特定示例有效:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node[] (n1) at (0,0) {1};
\node[] (n2) at (4,0) {2};
\draw[very thick, red, ->, shorten >=1cm] (n1) to[out=30,in=156,relative] (n2);
\draw[->] (n1) to [bend left] (n2); % original arc
\end{tikzpicture}
\end{document}
如果你真的把图片放大很多,它并不完全符合原始路径,但相当接近。可能有一种方法可以计算角度in
,但我不确定如何计算,我只是通过猜测和实验得到了这些数字。