用彩虹遮蔽弧线之间的区域

用彩虹遮蔽弧线之间的区域

我正在尝试以彩虹的方式遮蔽弧线之间的区域 - 并且我希望能够控制红色端是位于下端还是位于上端。MEW:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{through,calc,decorations.markings}
\begin{document}

\begin{tikzpicture}
   \coordinate (c1) at (0,0);    % center c1
  \foreach \ini/\fin/\rad in {40/50/    3.0,
                             120/160/   3.3,
                              80/42/    3.6,  %backwards
                             320/275/   3.9,  %backwards
                             180/223/   4.2,
                             265/ 285/  4.5}
 {  \draw[fill=green]
 ($(c1) + (\ini:\rad)$) arc (\ini:\fin:\rad)  
  --  ($(c1) + (\fin:\rad+0.3)$) arc (\fin:\ini:\rad+0.3) -- cycle;
  }
\end{tikzpicture}

%example of rainbow shading stolen from elsewhere
\pgfdeclareverticalshading{rainbow}{100bp}
{color(0bp)=(red); color(25bp)=(red); color(35bp)=(yellow); 
 color(45bp)=(green); color(55bp)=(cyan); color(65bp)=(blue); 
 color(75bp)=(violet); color(100bp)=(violet)} 
 \begin{tikzpicture}[shading=rainbow] 
  \shade[shading angle=90] (0,0) rectangle +(3,1); 
 \end{tikzpicture} 

\end{document}

在此处输入图片描述 您可以看到,我将弧线设为绿色,但我希望它们由红色变为紫色,或者由紫色变为红色(如果我先指定较大的角度,如第 3 行和第 4 行所示)。

提前致谢,

答案1

由于您只需要相对较短的弧段,因此我建议您作弊并使用线性着色,而不是尝试正确着色。您可以查找着色的定义color wheelpgflibraryshadings.code.tex尝试修改它,但很少有 PDF 阅读器可以正确呈现它。

我首先尝试使用shading angle键来旋转阴影,但除了最简单的情况外,它似乎在所有情况下都不起作用(我发布了关于该主题的单独问题)。相反,我现在使用该transform canvas选项并保留阴影角度。然而,这会弄乱边界框,所以我告诉 TikZ 忽略实际绘图并提供虚拟路径。

反转方向是通过有条件地将路径旋转 180 度两次来完成的,一次以影响阴影的方式,一次以不影响阴影的方式。如果\fin > \ini使用 pgfmath 的?:运算符,则可以完成此操作。

\documentclass[tikz]{standalone}
\usetikzlibrary{calc}

\begin{document}
    %example of rainbow shading stolen from the pgf manual
    \pgfdeclareverticalshading{rainbow}{100bp}{%
        color(0bp)=(red); color(25bp)=(red); color(35bp)=(yellow);
        color(45bp)=(green); color(55bp)=(cyan); color(65bp)=(blue);
        color(75bp)=(violet); color(100bp)=(violet)
    }

    \begin{tikzpicture}
        \coordinate (c1) at (0,0);    % center c1
        \foreach \ini/\fin/\rad in {40 / 50/  3.0,
                                    120/160/  3.3,
                                    80 / 42/  3.6,  %backwards
                                    320/275/  3.9,  %backwards
                                    180/223/  4.2,
                                    265/285/  4.5,
                                    80/42/2} {
            \begin{pgfinterruptboundingbox}
                \shade[shading=rainbow,rotate={\fin > \ini ? 0 : 180},transform canvas={rotate={(\fin + \ini) / 2 + (\fin > \ini ? 0 : 180)}}]
                    let \n1 = {(\fin - \ini) / 2} in
                        ($(c1) + (-\n1:\rad)$)
                    arc (-\n1:\n1:\rad)
                    --  ($(c1) + (\n1:\rad+0.3)$)
                    arc (\n1:-\n1:\rad+0.3)
                    -- cycle;
            \end{pgfinterruptboundingbox}
            \path
                    ($(c1) + (\ini:\rad)$)
                arc (\ini:\fin:\rad)
                --  ($(c1) + (\fin:\rad+0.3)$)
                arc (\fin:\ini:\rad+0.3)
                -- cycle;
        }
    \end{tikzpicture}
\end{document}

输出

相关内容