如何学习使用 pgf 创建通用(功能)阴影?

如何学习使用 pgf 创建通用(功能)阴影?

在 PGF/TikZ 手册中名为“通用(功能)着色”的部分中,有创建通用功能着色的命令的“解释”。

本节的作者假设 TeX 用户知道如何使用类型 4 函数。

但我不知道,那么我在哪里可以学到?有人能解释一下如何使用这个命令创建阴影吗?

答案1

TikZ 手册中提到的第 4 类函数是所谓的 Postscript 计算器函数,它是 PDF 规范支持的 Postscript 子集。实际子集在第 7 章中描述PDF 1.7 参考手册. 第四类函数本身在Postscript 语言参考第三版

除非您精通 Postscript 语言,否则我认为 PGF 的这一方面不太容易理解。

答案2

我不知道从哪里可以学到所有材料,但我可以尝试给你一些建议。以下内容附带说明,我只是涉猎了一点着色器编写,当然不是这个主题的专家。

从抽象的角度来说,函数式着色器由一个函数给出F:R → [0,1]³,其中 R 是 ℝ² 的某个子集(通常是矩形),[0,1]³ 被解释为所有 RGB 颜色的空间。所以F为阴影区域的每个点分配一种颜色。你的任务是提供F。 然后,每一次图像被渲染,观众评价F在图像内部的每个像素上(R 对应的点),并用返回的颜色为像素着色。

在 PGF 中,您可以使用以下命令指定此类函数\pgfdeclareshading

\pgfdeclarefunctionalshading
    {⟨shading name⟩}
    {⟨lower left corner⟩}{⟨upper right corner⟩}
    {⟨initialization code⟩}
    {⟨code for the actual shading⟩}

这里{⟨lower left corner⟩}{⟨upper right corner⟩}指定了矩形域 R ⊆ ℝ²,⟨initialization code⟩暂时可以忽略(详情请参阅 PGF 手册),这⟨code for the actual shading⟩是最难的部分。

阴影的实际代码必须用非常有限的子集来编写后记。大概是因为它的限制太严格,迫使你只能写非常简单的函数。即便如此,请注意,渲染一个阴影可能需要很长时间(并且每次显示文档时都必须进行渲染)。

PostScript 是基于堆栈的编程语言。如果您不熟悉这个概念,请尝试阅读有关该主题的维基百科文章。如果您不习惯基于堆栈的语言,请注意,即使编写非常简单的函数也可能是一个挑战。

允许的子集在 PGF 手册或 PDF 参考中列出:基本上,您只能使用数学函数、堆栈操作运算符和 if-then-else。您会注意到没有循环和变量。操作本身在 3.6 节中描述Postscript 语言参考第三版或者大概是其他关于 PostScript 的好书(例如参见维基百科的参考资料)。

在开始执行着色器函数时,堆栈由 R 中某个点的 x 和 y 坐标组成(以大点为单位),执行后,堆栈顶部的三个元素应为 [0,1] 中的实数,这些实数被视为该点颜色的红、绿、蓝分量。

答案3

作为创建复杂阴影的不同方法:您可以使用从上方查看的三维 pgfplots 图,并使用该colormap功能获取颜色。

例如,您在评论中提到的阴影,(1/r)*(cos(theta))^2在极坐标系中,可以像这样实现:

\documentclass{article}
\usepackage[]{pgfplots}

\begin{document}
\begin{tikzpicture}
\pgfplotsset{colormap={redblue}{rgb(0cm)=(1,0,0); rgb(1cm)=(0,0,1)}}
\begin{axis}[
    view={0}{90},
    width=7cm, height=7cm,
    xmin=-0.707, xmax=0.707, ymin=-0.707, ymax=0.707,
    hide axis]
\addplot3 [
    domain=0:360,
    y domain=0.1:1,
    surf,
    shader=interp
    ] ({y*cos(x)},
        {y*sin(x)},
        {(1/y)*(cos(x))^2});
\end{axis}
\end{tikzpicture}
\end{document}

r=0请注意,由于项 ,在 处有一个奇点1/r,这就是为什么中间有一个洞。洞越小,阴影就越不有趣。

相关内容