编辑1

编辑1

显然,我太天真了,我期望下面的代码

\documentclass[border=10pt,multi,tikz]{standalone}
\usetikzlibrary{fadings,backgrounds}
\pgfmathsetlengthmacro\hyd{sqrt(5)*.5*(145mm+2ex)}
\begin{tikzfadingfrompicture}[name=heulog]
  \foreach \i [remember=\i as \j (initially 180), count=\k from 0] in {160,140,...,0}
  \path [top color=transparent!100, bottom color=transparent!0, draw=transparent!100, line width=2.5pt, shading angle={-20*\k+80}] (0,0) -- ++(\j:\hyd) arc (\j:\i:\hyd) -- cycle;
\end{tikzfadingfrompicture}
\begin{document}
\begin{tikzpicture}
  \path [ball color=magenta] (-.125*\hyd,0) -- (0,.25*\hyd) -- (.125*\hyd,0) -- (0,-.75*\hyd) -- cycle;
  \begin{scope}[on background layer]
    \coordinate [yshift=-1ex] (h) at (0,-.75*\hyd);
    \begin{scope}[shift=(h)]
      \path [scope fading=heulog, fit fading=false] (0,0);
      \foreach \i [remember=\i as \j (initially 180)] in {160,140,...,0}
      \path [fill=blue!50!cyan] (0,0) -- ++(\j:\hyd) arc (\j:\i:\hyd) -- cycle;
    \end{scope}
  \end{scope}
\end{tikzpicture}
\end{document}

生产

预期输出

但事实上,结果是

实际产量

在我的实际文档中,我无法轻易控制前景绘图的绝对坐标。因此,为了回答这个问题,假设我无法更改

      \path [ball color=magenta] (-.125*\hyd,0) -- (0,.25*\hyd) -- (.125*\hyd,0) -- (0,-.75*\hyd) -- cycle;

如何修改背景层上的代码和/或定义以heulog产生预期的输出,而不改变主层上的内容代码,也不改变绘制事物的顺序?

对于 MWE 的轻微复杂性,我深表歉意。我很难用最少的代码令人满意地解决问题。

编辑1

tikzfadingfrompicture正如 Zarko 在评论中指出的那样,可以通过缩放来调整衰落,使其正确居中1.5。这在实践中会出现问题,因为正确的标量并不总是容易计算的。然而,以这种方式缩放衰落的主要问题类似于让 Ti 的问题Z 自动缩放:褪色被严重稀释,没有给出从完全不透明到完全透明的褪色效果。也就是说,输出是

稀释衰落

如果这是你想要的,那就太好了,但不幸的是,这不是我需要的。

编辑1a

透明度确实很重要,因为它必须在彩色背景上工作。

编辑2

以下有效,但我不确定为什么。

\begin{tikzpicture}
  \path [ball color=magenta] (-.125*\hyd,0) -- (0,.25*\hyd) -- (.125*\hyd,0) -- (0,-.75*\hyd) -- cycle;
  \begin{scope}[on background layer]
    \path (0,-.75*\hyd) ++(0,-1ex) coordinate (h) (0,.25*\hyd) ++(0,1ex) coordinate (o);
    \path (h);
    \pgfgetlastxy{\hx}{\hy}
    \path (o);
    \pgfgetlastxy{\ox}{\oy}
    \pgfmathsetmacro\hydy{(\hy+\oy)/2}
    \pgfsetfading{heulog}{\pgftransformshift{\pgfpoint{0}{\hydy pt}}}
    \begin{scope}[shift=(h)]
      \foreach \i [remember=\i as \j (initially 180)] in {160,140,...,0}
      \path [fill=blue!50!cyan] (0,0) -- ++(\j:\hyd) arc (\j:\i:\hyd) -- cycle;
    \end{scope}
  \end{scope}
\end{tikzpicture}

我的理论是,一方面调整图片顶部与原点之间的距离差异,另一方面调整图片底部与原点之间的距离差异。

但是,这在我的实际代码中失败了。在那里,使用

\pgfmathsetlengthmacro\hydy{(\hy+\oy)+1ex}%

似乎接近预期结果。我无法给出完整的代码,因为代码太多了,但直接上下文如下,其中staff是包含前景中绘制内容的局部边界框。

...
    \path (staff.south) ++(0,-1ex) coordinate (h) (staff.north) ++(0,1ex) coordinate (o);
    \path (h);
    \pgfgetlastxy{\hx}{\hy}%
    \path (o);
    \pgfgetlastxy{\ox}{\oy}%
    \pgfmathsetlengthmacro\hydy{(\hy+\oy)+1ex}%
    \pgfsetfading{heulog}{\pgftransformshift{\pgfpoint{0}{\hydy}}}
    \begin{scope}[shift=(h)]
      % commenting the \pgfsetfading above and uncommenting this also works
      %\path [scope fading=heulog, fading transform={shift={(0,\hydy)}}, fit fading=false] (0,0);
      \foreach \i [remember=\i as \j (initially 180), count=\k from 0, evaluate=\k as \ll using \k*100/8] in {160,140,...,0}
      \path [fill=Green4!\ll!Red3] (0,0) -- ++(\j:\hyd) arc (\j:\i:\hyd) -- cycle;
    \end{scope}
...

但这完全没有道理。(至少,我假设这对 Ti 的大脑来说是有意义的Z,但它对大自然赋予我的微不足道的东西没有任何作用!)

答案1

您可以tikzfadingfrompicture通过fading transform按键变换(移动、旋转等)。这里,解决方案可能是:

fading transform={shift={(current bounding box.center)}}

注意:ghostscript无法正确呈现该文档...

代码:

\documentclass[border=10pt,multi,tikz]{standalone}
\usetikzlibrary{fadings,backgrounds}
\pgfmathsetlengthmacro\hyd{sqrt(5)*.5*(145mm+2ex)}
\begin{tikzfadingfrompicture}[name=heulog]
  \foreach \i [remember=\i as \j (initially 180), count=\k from 0] in {160,140,...,0}
  \path [top color=transparent!100, bottom color=transparent!0, draw=transparent!100, line width=2.5pt, shading angle={-20*\k+80}] (0,0) -- ++(\j:\hyd) arc (\j:\i:\hyd) -- cycle;
\end{tikzfadingfrompicture}
\begin{document}
\begin{tikzpicture}
  \path [ball color=magenta] (-.125*\hyd,0) -- (0,.25*\hyd) -- (.125*\hyd,0) -- (0,-.75*\hyd) -- cycle;
  \fill[red] circle(2pt);
  \begin{scope}[on background layer]
    \coordinate [yshift=-1ex] (h) at (0,-.75*\hyd);
    \begin{scope}[shift=(h)]
      \path
      [scope fading=heulog, fit fading=false,
      fading transform={shift={(current bounding box.center)}}]
      (0,0);
      \foreach \i [remember=\i as \j (initially 180)] in {160,140,...,0}
      \path [fill=blue!50!cyan] (0,0) -- ++(\j:\hyd) arc (\j:\i:\hyd) -- cycle;
    \end{scope}
  \end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容