TikZ `阴影角度` 键如何工作?

TikZ `阴影角度` 键如何工作?

回答时这个问题,我发现该shading angle键没有按照我的预期执行。以下 MWE 说明了这个问题。我定义了一个具有锐边的阴影,以便更容易看到它的方向。

\documentclass[tikz,margin=5pt]{standalone}

\begin{document}
    \pgfdeclareverticalshading{myshading}{100bp}{color(0bp)=(red); color(49bp)=(red); color(51bp)=(green); color(100bp)=(green)}

    \begin{tikzpicture}[scale=2]
        \draw[shading=myshading,shading angle=15]
                (0:1)
            arc (0:30:1)
            --  (30:1.2)
            arc (30:0:1.2)
            -- cycle;
        \draw (0,0) -- (15:1.2);
    \end{tikzpicture}
\end{document}

这是结果。请注意,尽管线和的角度shading angle都设置为 15 度,但阴影中的过渡和线并不平行。

“错误”的结果

这是我所期望的:

预期结果

pgfmanual 中有关阴影路径的部分并没有真正解释这个键的工作原理。

答案1

以下是我根据自己的实验得出的钥匙工作原理,分为五个步骤:

用于解释的步骤

  1. 首先,将选定的阴影应用到方形画布上
  2. 然后,shading angle应用密钥。
  3. 然后将画布调整为要着色的路径的边界框的大小。如果结果不是正方形,则会改变渐变的角度!
  4. 画布被移动,因此它位于路径下方。
  5. 最后,它被剪裁以完全位于路径内。

当然,中间步骤并没有被真正画出来。如果有人感兴趣的话,下面是我制作图像的方式:

\documentclass[tikz,margin=5pt]{standalone}
\usetikzlibrary{calc}

\begin{document}
    \pgfdeclareverticalshading{myshading}{100bp}{color(0bp)=(red); color(49bp)=(red); color(51bp)=(green); color(100bp)=(green)}

    \begin{tikzpicture}[scale=2]
        \newcommand*\outline[1][draw]{
            \path[#1]
                   ($(c) + (0:1)$)    coordinate (p1)
                arc (0:30:1)           coordinate (p2)
                --  ($(c) + (30:1.2)$) coordinate (p3)
                arc (30:0:1.2)         coordinate (p4)
                -- cycle;
            \coordinate (sw) at (p1 -| p4);
            \coordinate (ne) at (p2 |- p3);
            \coordinate (center) at ($(sw)!.5!(ne)$);
            \fill (c) circle (1pt);
            \path[#1] (c) -- ($(c) + (15:1.2)$);
        }

        \coordinate (c) at (0,0);
        \shade[shading=myshading] (c) +(-.5,-.5) rectangle +(.5,.5);
        \outline
        \node[below] at (c) {1};

        \coordinate (c) at (2,0);
        \shade[shading=myshading,shading angle=15] (c) +(-.5,-.5) rectangle +(.5,.5);
        \outline
        \node[below] at (c) {2};

        \coordinate (c) at (4,0);
        \outline[]
        \shade[shading=myshading,shading angle=15] ($(sw) - (center) + (c)$) rectangle ($(ne) - (center) + (c)$);
        \outline
        \node[below] at (c) {3};

        \coordinate (c) at (1,-2);
        \outline[]
        \shade[shading=myshading,shading angle=15] (sw) rectangle (ne);
        \outline
        \node[below] at (c) {4};

        \coordinate (c) at (3,-2);
        \outline[draw,shading=myshading,shading angle=15]
        \node[below] at (c) {5};
    \end{tikzpicture}
\end{document}

相关内容