我正在尝试以彩虹的方式遮蔽弧线之间的区域 - 并且我希望能够控制红色端是位于下端还是位于上端。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 wheel
并pgflibraryshadings.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}