显然,我太天真了,我期望下面的代码
\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}