如何控制 TikZ 中的淡入淡出大小?

如何控制 TikZ 中的淡入淡出大小?

我正在尝试使用 创建淡入淡出效果tikzfadingfrompicture,但我不明白 TikZ 如何计算淡入淡出效果的大小。我假设 TikZ 计算要淡入淡出的图像的边界框,然后拉伸淡入淡出图片以使其边界框与图像的边界框匹配,但以下代码片段证明我错了。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{patterns,fadings}

\begin{document}

\begin{tikzfadingfrompicture}[name=fade frame]
  \draw[transparent!0,step=0.2cm] (-1,-1) grid (1,1);
\end{tikzfadingfrompicture}

\begin{tikzpicture}
  \fill [black!20] (-2,-2) rectangle (7,7);
  \pattern [pattern=checkerboard, pattern color=black!30] (-2,-2)
  rectangle (7,7);
  \draw[step=0.5cm,very thin] (-2,-2) grid (7,7);
  \fill [path fading=fade frame,red] (-2,-2) rectangle (7,7);
\end{tikzpicture}

\end{document}

我得到的图片有 9 个方块,而不是我预期的 10 个(因为褪色中的原始网格宽度为 2 厘米,步长为 0.2 厘米)。我做错了吗?我怎样才能让 TikZ 使用整个褪色图片?

答案1

以下是 50% 的实验、50% 的尝试读取 TikZ 代码以及 100% 的猜测。

看来,当 TikZ/PGF 使用路径作为淡入淡出时,它不会使用所有的路径。事实上,从文件中的以下注释可以清楚地看出这一点pgfcoretransparency.code.tex

% This command works a bit like \pgfshadepath. "Works a bit like"
% means the following: The masks's original size should
% completely cover the area between (0,0) and (100bp,100bp). The
% mask is then rescaled so that it completely covers the path.

关键部分是关于“蒙版的原始大小”的部分。这表明,当从图片(或路径)指定淡入淡出时,实际使用的蒙版是位于某个框中的任何东西,而不是整个图片。(人们可以争论这是否是正确的做法,但这不是讨论这个问题的地方。)

然而上述评论中建议的矩形似乎不合适。(这就是实验的用武之地。)似乎发生的情况是,使用的片段来自图片中心,大小为 50bp。也就是说,找到图片的中心并放置一个边长为 50bp 的正方形,使其中心位于图片的中心。

为了证实这一点,我们可以考虑上述文件中给出的示例:

 \pgfdeclarefading{fade right}
 {\tikz[left color=transparent!0,right color=transparent!100]
    (0,0) rectangle (100bp,100bp);}

这似乎定义了一个矩形阴影,从左侧的全彩色到右侧的完全透明。 以下代码显示情况并非如此。 事实上,为了得到这个结果,我们必须将尺寸缩小到50bp

衰落

\documentclass{standalone}
%\url{http://tex.stackexchange.com/q/19596/86}
\usepackage{tikz}
\usetikzlibrary{patterns,fadings}

\begin{document}

\pgfdeclarefading{test fading b}
 {\tikz
    \fill[left color=transparent!0,right color=transparent!100] (0,0) rectangle (50bp,50bp);}

\pgfdeclarefading{test fading a}
 {\tikz
    \fill[left color=transparent!0,right color=transparent!100] (0,0) rectangle (100bp,100bp);}

\begin{tikzpicture}[scale=2]
\fill[gray!50] (-.5,-.5) rectangle (3.5,1.5);
\filldraw[path fading=test fading a,fill=purple] (0,0) rectangle (1,1);
\filldraw[path fading=test fading b,fill=purple] (2,0) rectangle (3,1);
\end{tikzpicture}
\end{document}

进一步的实验确实表明,所使用的衰落部分是给定图片的中心。

现在我们可以看到你的褪色出了什么问题。如果我们绘制实际图片(颜色已更改,以便我们可以看到它们)并叠加一个正方形,50bp那么我们就可以明白为什么产生的褪色只有 9 个正方形。

电网衰落

\documentclass{standalone}
%\url{http://tex.stackexchange.com/q/19596/86}
\usepackage{tikz}
\usetikzlibrary{patterns,fadings}

\begin{document}

\begin{tikzpicture}[scale=4]
  \draw[black,step=0.2cm] (-1,-1) grid (1,1);
\draw[red] (-25bp,-25bp) rectangle (25bp,25bp);
\end{tikzpicture}
\end{document}

scale所有这些中的 s 只是为了获得合适大小的图像;它们没有实际区别。)

这与我们编译您的代码时得到的结果相对应:

原始图片

因此,解决方案是将原始的褪色画在边长为的框中50bp。这样就可以得到所需的结果。

\documentclass{standalone}
%\url{http://tex.stackexchange.com/q/19596/86}
\usepackage{tikz}
\usetikzlibrary{patterns,fadings}

\begin{document}

\begin{tikzfadingfrompicture}[name=fade frame]
  \draw[transparent!0,step=5bp] (0,0) grid (50bp,50bp);
\end{tikzfadingfrompicture}

\begin{tikzpicture}
  \fill [black!20] (-2,-2) rectangle (7,7);
  \pattern [pattern=checkerboard, pattern color=black!30] (-2,-2)
  rectangle (7,7);
  \draw[step=0.5cm,very thin] (-2,-2) grid (7,7);
  \fill [path fading=fade frame,red] (-2,-2) rectangle (7,7);
\end{tikzpicture}
\end{document}

有 10 个方格的网格

(我越想越觉得,这样做是有逻辑的。但不管合理与否,这似乎没有记录,肯定不太理想!)

相关内容