tikz 径向阴影从角落开始并保持圆形

tikz 径向阴影从角落开始并保持圆形

我正在尝试重现类似于下图的阴影: 期望结果 如您所见,阴影从左上角开始,颜色环是圆形。但是,阴影也正确地随矩形的大小缩放。它总是合理地填充区域,并且环保持圆形。此结果是使用 Powerpoint 生成的。

现在我想用 LaTeX 重现相同(或至少类似)的效果。在考虑了几个问题和答案之后(例如Tikz 可以实现可调位置的多停止渐变填充吗?),我得到了以下代码:

\documentclass{standalone}
\usepackage{tikz}

\begin{document}

\pgfdeclareradialshading{fradial}{\pgfpoint{-40bp}{40bp}}{
  rgb(0)=(0.0,0.0,0.0);
  rgb(13bp)=(1.0,0.0,0.0);
  rgb(32bp)=(0.0,1.0,0.0);
  rgb(40bp)=(0.0,0.0,1.0)
}

\begin{tikzpicture}
        \fill[shading=fradial] (0,0) rectangle (34,11);
\end{tikzpicture}

\end{document}

此代码产生以下结果: 在此处输入图片描述 有点类似,但还不够接近。目前有两个问题:

  1. 阴影没有正确地从左上角开始
  2. 阴影被扭曲成椭圆形而不是周期性的。

我猜第一点和上面提到的事情有关这里,阴影的那部分未使用。不幸的是,我并不完全理解 tikz 手册中的这一部分。我以为我已经理解了,并将我的值放大到,100bp但后来我的框架中几乎只有黑色部分。这很奇怪。

那么我该如何实现这两者:从左上角正确开始并保持阴影循环。

我担心解决方案会与剪辑有关。但我对出现的解决方案非常感兴趣。

还有一件事。为了简化 MWE,我使用 -command 重现了我的结果\fill。稍后将对 进行阴影处理\node

先感谢您。

答案1

您可以\clip在阴影方块上使用。如果更改阴影的定义,会更容易。

\documentclass{standalone}
\usepackage{tikz}

\begin{document}

\pgfdeclareradialshading{fradial}{\pgfpoint{0bp}{0bp}}{
  rgb(0)=(0.0,0.0,0.0);
  rgb(13bp)=(1.0,0.0,0.0);
  rgb(32bp)=(0.0,1.0,0.0);
  rgb(40bp)=(0.0,0.0,1.0)
}

\begin{tikzpicture}
        \clip (0,0) rectangle (34,-11);
        \fill[shading=fradial] (-34,-34) rectangle (34,34);
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

您可以使用一些技巧来实现它,例如修改阴影方块,使用一些颜色选择器来获得所需的颜色,当然还可以使用\clip.

结果:

在此处输入图片描述

梅威瑟:

\documentclass{standalone}
\usepackage{tikz}

\begin{document}
    
    \pgfdeclareradialshading{fradial}{\pgfpoint{-34bp}{34bp}}{
        rgb(0bp)=(0,0,0);
        rgb(9bp)=(0.2,0,0);
        rgb(14bp)=(1,0,0);
        rgb(20bp)=(0.42,0.39,0.17);
        rgb(24bp)=(0.015,0.675,0.304);%4, 173, 78
        rgb(26bp)=(0.015,0.675,0.304);%4, 173, 78
        rgb(28bp)=(0,0.687,0.546);%0, 176, 140
        rgb(32bp)=(0,0.687,0.917);%0, 176, 235
        rgb(36bp)=(0,0.687,0.917)%0, 176, 140
    }
    \begin{tikzpicture}
        \clip (0,0) rectangle ++(34,11);
        \fill[shading=fradial] (0,-21) rectangle ++(34,38); %(34,11);
    \end{tikzpicture}
    
\end{document}

答案3

非常感谢 J Leon V. 和 user272921 指出了正确的方向。有了这些信息,我就能构建解决方案。

首先:我现在明白了径向阴影的缩放是如何工作的。在 pgfmanual 中,它详细描述了水平阴影,但没有描述径向阴影。径向阴影的缩放使得为 25bp 定义的颜色恰好位于要着色的路径边界框的边框上。对于我的矩形,这意味着 25bp 的颜色恰好位于矩形的边缘。

此外,中指定的点\pgfdeclareradialshading不会移动阴影,而是会扭曲它。如果移动点实际上在圆圈之外,这会产生奇怪的结果。我应该早点打印阴影\pgfuseshading才能注意到这一点。

将这两个发现与特别是path picture(也方便剪辑)结合起来,产生了一个很好的结果:

新结果

代码:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}

\pgfdeclareradialshading{fradial}{\pgfpoint{0bp}{0bp}}{
    rgb(0)=(0.0,0.0,0.0);
    rgb(9bp)=(1.0,0.0,0.0);
    rgb(20bp)=(0.0,0.690,0.314);
    rgb(25bp)=(0.0,0.690,0.941)
}

\begin{document}

\begin{tikzpicture}[
        myshading/.style = {
            path picture={
                \fill[shading=fradial]
                    let 
                        \p0 = (path picture bounding box.north west),
                        \p1 = ($ (path picture bounding box.south east) - (path picture bounding box.north west) $),
                        \n0 = {veclen(\x1,\y1)},
                        \p{upper left} = (\x0-\n0, \y0+\n0),
                        \p{lower right} = (\x0 + \n0, \y0 - \n0)
                    in
                        (\p{upper left}) rectangle (\p{lower right});
            }
        }
    ]

    \Huge
    \node[minimum width = 34 cm, minimum height = 11 cm, text=white,myshading] at (0,0) {Hello World};
    
\end{tikzpicture}

\end{document}

首先,我将阴影的定义移到文档之外,以消除由此产生的一些额外的空白。

我使用了我在 Powerpoint 中使用的颜色定义(抱歉,我应该首先在原始问题中这样做,但没想到有人会照顾颜色,因为我对原理更感兴趣)。

在里面path picture我做了一些计算来自动计算正方形的大小,需要绘制正方形才能获得正确的阴影。它需要是一个正方形,这样颜色实际上是圆形而不是椭圆形。它需要稍微大一点,这样 25bp 的颜色就不会在矩形的边缘,而是在最远的角落。否则右下角会是黑色(可以通过用 替换 的定义来测试这\n0一点\n0={max(abs(\x1),abs(\y1))}

在这个解决方案中,除了奇怪的 25bp 之外,几乎没有涉及任何神奇数字。其他一切都是自动计算的。

与期望结果相比,结果并非 100% 匹配,因为阴影本身的计算方式似乎不同。因此,像 J. Leon V. 所做的那样添加更多点会有所帮助。但最终结果比我想象的要接近得多。

相关内容