如何在 tikz 中绘制曲线渐变/淡入淡出?

如何在 tikz 中绘制曲线渐变/淡入淡出?

我想绘制如下图所示的图表:

在此处输入图片描述

我的问题是绘制逐渐消失的灰色曲线路径。 淡入淡出的方向不断变化,因此它始终垂直于路径。 如何在 tikz 中绘制这样的曲线淡入淡出?

答案1

我看了一些类似的答案,但由于我对其内部工作原理的了解TikZ并不多,所以我选择了一个幼稚的答案——画几条线,逐渐增加厚度和透明度。

好吧,这就是想法,代码实际上绘制了厚度和透明度逐渐减小的线条。由于这会产生一条两边都有渐变的线,所以必须隐藏一半。我对这个解决方案并不完全满意,但我也想不出更好的办法了。代码如下:

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{fp}

\begin{document}
\begin{tikzpicture}
% Set parameters here
\newcommand\linethick{6}      % How thick, in pt, the curve will be
\newcommand\fineness{20}      % How many shades between grey and white to draw
\coordinate (start) at (0,0); % Where the curve will start
\coordinate (end) at (3,0);   % Where the curve will end
\newcommand\outangle{300}     % Angle at which the curve leaves "start"
\newcommand\outstrength{1.5}  % Strength at which the curve leaves "start"
\newcommand\inangle{210}      % Angle at which the curve arrives at "end"
\newcommand\instrength{1}     % Strength at which the curve arrives at "end"
\newcommand\safeguard{3}      % A number > 0, to be increased, in case unwanted half of curve isn't hidden
% Loop of lines
\foreach \x in {0,...,\fineness}{
  \FPeval\shader{\x*100/\fineness}
  \FPeval\thicker{\linethick*2-\x*\linethick*2/\fineness}
  \draw[line width=\thicker,draw=gray!\shader] (start) .. controls +(\outangle:\outstrength) and +(\inangle:\instrength) .. (end);
}
% Hide other side of curve
\FPeval\newlinethick{\linethick+\safeguard}
\draw[fill=white,draw=white,line width=.3pt] (start) .. controls +(\outangle:\outstrength) and +(\inangle:\instrength) .. (end)--++(\inangle-90:\newlinethick pt) .. controls +(\inangle:\instrength) and +(\outangle:\outstrength) .. ($(start)+(\outangle+90:\newlinethick pt)$)--(start)--cycle;
\end{tikzpicture}
\end{document}

结果:

在此处输入图片描述

这种方法只适用于两点之间的曲线。我希望输入参数的描述清楚。

请注意最后一个参数,\safeguard它处理的是当曲线非常粗时,它在曲线外部的强度与它在曲线中间的强度不同。因此,增加此参数会使隐藏另一半的白色形状在远离曲线中间的一侧变得更粗。

另外,请注意隐藏形状的线宽不为零,而不仅仅是\fill,这是因为使用\fill会在曲线的两端产生细长的线条,为了隐藏它们,我不得不稍微放大形状。这也会从曲线渐变的较暗侧带走一点,但并不明显。

答案2

我相信有一种方法可以生成高质量的曲线渐变。这种阴影目前不适用于 tikz/pgf,但pgfplots基于它构建的库可以生成它们。

在此处输入图片描述

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\usepgfplotslibrary{patchplots}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    hide axis,
    x=1pt,y=1pt]

  \addplot[patch,
    patch type=biquadratic,
    shader=interp,
    colormap={bw}{gray=(1) gray=(0.7)},
    nodes near coords=\coordindex,
    point meta=explicit,
    ]
  coordinates 
  {
    (3,-36)    [0]   % 0: lower left corner
    (626,-41)  [0]  % 1: lower right corner
    (604,-10) [1]   % 2: upper right corner
    (40,-17) [1]  % 3: upper left corner
    %
    (236,-180) [0] % 4: lower middle
    (617,-25) [0] % 5: right middle
    (240,-140) [0] % 6: upper middle
    (23,-27) [0] % 7: left middle
    %
    (238,-160) [0] % 8: middle
  };
  \end{axis}

\end{tikzpicture}
\end{document}

这里,我们有一个隐藏轴,pgfplots其中包含一个阴影表面图。这反过来又利用了patch type=biquadratic它是众多受支持的曲线渐变之一。一个biquadratic面片由 9 个点按特定顺序定义:首先是顶点坐标,然后是中点坐标,然后是中心坐标,如说明所示nodes near coords。颜色值在每个坐标后的方括号中明确提供(这是 的效果point meta=explicit)。

请注意,我在这里选择使用colormap,这意味着颜色值实际上是映射到 的标量值colormap={bw}{gray=(1) gray=(0.7)}。此映射策略可以轻松自定义渐变。例如,默认colormap配置会pgfplots产生以下输出(即,如果您取消注释colormap=...):

在此处输入图片描述

我的方法的缺点是pgfplots旨在可视化数据,因此需要更多的工作才能将这种阴影无缝地集成到tikzpicture(手册中有一节关于 TikZ 互操作性的内容pgfplots)。

请注意,上面的坐标来自图像程序:我截取了您的图片的屏幕截图并使用 gimp 读取像素坐标。

patch使用绘图的方法shader=interp可以轻松定义具有平滑但复杂几何形状的阴影渐变。此外,可以将多个这样的阴影并排放置(通过提供另一组 9 个坐标)。还有接受贝塞尔坐标、三角形面片或双三次面片的阴影,请比较 中的“面片绘图”文档pgfplots

相关内容