我正在寻找一种方便的方法来绘制平滑的锥形路径(即多变的使用 TikZ 将线宽设置为以箭头结尾 — 如下所示(在 Inkscape 中绘制):
一种方法是使用自定义装饰如所述在这个答案中(自 2011 年 3 月起),但也许现在有更直接的方法。
我想到的一个想法是画一条平滑的路径持续的线宽,并用另一条路径从尾部开始裁剪,一直到箭头的起点。但是,我刚刚注意到,在路径上添加箭头实际上会改变路径本身(参见下面的代码片段和输出),这可能使这种方法比我最初想象的要复杂一些。
\usetikzlibrary{arrows.meta}
\begin{tikzpicture}
\draw[line width=1mm, black!40, -{Stealth[length=10mm, width=6mm]}] (0,0) .. controls (2,-1) and (4,-1) .. (6,0);
\draw[line width=.2mm] (0,0) .. controls (2,-1) and (4,-1) .. (6,0);
\end{tikzpicture}
[编辑] 感谢@Markus G. 的评论,路径更改问题已解决(见下文)。如何继续?
\usetikzlibrary{bending, arrows.meta}
答案1
我根据@Alain Matthes 的建议提出了一个解决方案(或至少是解决方案的开始)回答。看上面的图片,我们在左边看到解决方案有效的情况(简单to[]
操作)和无效的情况(arc
操作)。右下角的曲线是 Alain 的答案中的原始曲线width factor = 1
(供参考)。
show path construction
我引入了一个装饰,将 Alain 的装饰和引入箭头的装饰放在一起。有三个参数:width factor
和颜色,start color
和end color
(在上一个答案中已经存在)。
请注意,生成的曲线略长;图像中左下方曲线上绘制的黄色曲线显示的是原始路径。
备注1.\w
您可以通过修改和定义中的常量来修改曲线和箭头在交点处的宽度关系\d
。
备注2.我认为可以以更智能的方式修改 Alain 的装饰以产生您想要的结果,但我不知道如何做(我不知道如何使用pgf
命令)。
代码
\documentclass[11pt, border=.5cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{math, arrows.meta}
\usetikzlibrary{decorations.pathreplacing}
%%% Alain Matthes's decoration
\pgfkeys{/pgf/decoration/.cd,
width factor/.store in =\wfactor,
start color/.store in =\startcolor,
end color/.store in =\endcolor
}
\makeatletter
\pgfdeclaredecoration{width and color change}{initial}{
\state{initial}[width=0pt, next state=line, persistent precomputation={%
\pgfmathdivide{50}{\pgfdecoratedpathlength}%
\let\increment=\pgfmathresult%
\def\x{0}%
}]{}
\state{line}[width=.5pt, persistent postcomputation={%
\pgfmathadd@{\x}{\increment}%
\let\x=\pgfmathresult%
}]{%
\pgfsetlinewidth{\wfactor*\x/50*0.075pt+\pgflinewidth}%
\pgfsetarrows{-}%
\pgfpathmoveto{\pgfpointorigin}%
\pgfpathlineto{\pgfqpoint{.75pt}{0pt}}%
\pgfsetstrokecolor{\endcolor!\x!\startcolor}%
\pgfusepath{stroke}%
}
\state{final}{%
\pgfsetlinewidth{\pgflinewidth}%
\pgfpathmoveto{\pgfpointorigin}%
\color{\endcolor!\x!\startcolor}%
\pgfusepath{stroke}%
}
}
\makeatother
\begin{document}
\tikzset{
tmp/.style n args={3}{
postaction={
decoration={
width and color change,
width factor=#1,
start color=#2,
end color=#3
}, decorate
},
preaction={
decoration={
show path construction,
curveto code={
\tikzmath{
real \w, \d;
\w = {#1*60};
\d = {#1*90};
}
\draw[#3,
arrows={-Stealth[width=\w pt, length=\d pt]}]
(\tikzinputsegmentfirst) .. controls
(\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
..(\tikzinputsegmentlast) -- ([turn]0: \w pt);
}
}, decorate
}
}
}
\begin{tikzpicture}
\draw[tmp={.4}{blue}{gray}] (0, 0) to[out=0, in=150] ++(6, 2);
\draw[tmp={.4}{blue}{gray}] (0, -1) to[out=0, in=150] ++(6, 2);
\draw[yellow, thin] (0, -1) to[out=0, in=150] ++(6, 2);
\path[tmp={.4}{yellow}{red}] (14, -1) arc (0: 120: 4);
\draw[line width=.4pt, decoration={width and color change,
width factor=1, start color=yellow, end color=red},
decorate] (14, -3) arc (0:120:4cm);
\end{tikzpicture}
\end{document}