在 TikZ 中结合缩短和弯曲选项

在 TikZ 中结合缩短和弯曲选项

有没有办法结合bend leftshorten选项来使弧变短保持其形状否则?

即当我这样做

\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>选项bendtakes(参见下面的代码) - 不完美,但我认为令人满意 - 或者在端点之间绘制一条曲线(在您的例子n1n2)并仅显示其中的一部分(另见下文):

\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

您需要使用inout角度。这似乎对您的特定示例有效:

\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,但我不确定如何计算,我只是通过猜测和实验得到了这些数字。

相关内容