![TikZ:环的径向阴影](https://linux22.com/image/258362/TikZ%EF%BC%9A%E7%8E%AF%E7%9A%84%E5%BE%84%E5%90%91%E9%98%B4%E5%BD%B1.png)
我想要一个圆环的径向阴影,从内半径 r1 > 0 处的内颜色(红色)到外半径 r2 > r1 处的外颜色(白色)。但是
\filldraw[even odd rule,inner color=red,outer color=white]
(0,0) circle (2.2)
(0,0) circle (1.8);
内圈仅遮盖了外圈的阴影:
如何为阴影选择一个有限的内半径,使得全色彩从 r1 = 1.8 开始?
答案1
你是指第一个或者第二个圆圈之类的东西吗?
它们实现的代码是:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\filldraw[even odd rule,inner color=red,outer color=white] (0,0) circle (2.2);
\draw(0,0) circle (1.8);
\begin{scope}[xshift=6cm]
\filldraw[even odd rule,inner color=red,outer color=red!5] (0,0) circle (1.8);
\draw(0,0) circle (2.2);
\end{scope}
\end{tikzpicture}
\end{document}
正如 percusse 所说,唯一可能的方法是定义一个新的径向阴影。以下是一个例子:
\documentclass{article}
\usepackage{tikz}
\pgfdeclareradialshading{ring}{\pgfpoint{0cm}{0cm}}%
{rgb(0cm)=(1,1,1);
rgb(0.7cm)=(1,1,1);
rgb(0.719cm)=(1,1,1);
rgb(0.72cm)=(0.975,0,0);
rgb(0.9cm)=(1,1,1)}
\begin{document}
\begin{tikzpicture}
\filldraw[shading=ring] (0,0) circle (2.2);
\draw[fill=white](0,0) circle (1.8);
\begin{scope}[xshift=6cm]
\filldraw[shading=ring] (0,0) circle (2.2);
\draw(0,0) circle (1.8);
\end{scope}
\end{tikzpicture}
\end{document}
这将为您提供:
我猜这就是你的目的。请注意,该选项fill=white
实际上并不是必需的,但它已用于比较两个结果。
简单添加自定义颜色:选项与定义的相同如何为思维导图概念着色?。
代码:
\documentclass{article}
\usepackage{tikz}
\makeatletter
\pgfdeclareradialshading[tikz@ball]{ring}{\pgfpoint{0cm}{0cm}}%
{rgb(0cm)=(1,1,1);
rgb(0.719cm)=(1,1,1);
color(0.72cm)=(tikz@ball);
rgb(0.9cm)=(1,1,1)}
\tikzoption{ring color}{\pgfutil@colorlet{tikz@ball}{#1}\def\tikz@shading{ring}\tikz@addmode{\tikz@mode@shadetrue}}
\makeatother
\begin{document}
\begin{tikzpicture}
\filldraw[shading=ring, ring color=red] (0,0) circle (2.2cm);
\draw(0,0) circle (1.8cm);
\begin{scope}[xshift=7cm]
\filldraw[shading=ring] (0,0) circle (3) circle (2.45);
\end{scope}
\end{tikzpicture}
\end{document}
结果:
答案2
您需要一次性创建区域,并使用even odd rule
或nonzero rule
使用一些技巧来实现这些应用程序。以下是一个例子:
\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{fadings}
\pgfdeclareradialshading{myring}{\pgfpointorigin}
{
color(0cm)=(transparent!0);
color(5mm)=(pgftransparent!50);
color(1cm)=(pgftransparent!100)
}
\pgfdeclarefading{ringo}{\pgfuseshading{myring}}
\begin{document}
\begin{tikzpicture}
\filldraw[even odd rule,red ,path fading=ringo] (0,0) circle (16mm) (0,0) circle (2cm);
\filldraw[even odd rule,blue,path fading=ringo] (0,0) circle (3mm) (0,0) circle (0.5cm);
\end{tikzpicture}
\end{document}
答案3
这是一个扩展的解决方案克劳迪奥·菲安德里诺的解决方案。此解决方案使用 pgfkeys 自动计算具有不同内半径和外半径的新阴影。语法为:
环形阴影={来自 <颜色> 在 <内半径> 处至 <颜色> 在 <外半径>}
(笔记:我唯一还是不明白的是:为什么我们要使用该值0.8818cm
来获得正确的结果?)
\documentclass{standalone}
\usepackage{tikz}
\tikzset{
ring shading/.code args={from #1 at #2 to #3 at #4}{
\def\colin{#1}
\def\radin{#2}
\def\colout{#3}
\def\radout{#4}
\pgfmathsetmacro{\proportion}{\radin/\radout}
\pgfmathsetmacro{\outer}{.8818cm}
\pgfmathsetmacro{\inner}{.8818cm*\proportion}
\pgfmathsetmacro{\innerlow}{\inner-0.01pt}
\pgfdeclareradialshading{ring}{\pgfpoint{0cm}{0cm}}%
{
color(0pt)=(white);
color(\innerlow)=(white);
color(\inner)=(#1);
color(\outer)=(#3)
}
\pgfkeysalso{/tikz/shading=ring}
},
}
\begin{document}
\begin{tikzpicture}
\shade[even odd rule,ring shading={from red at 1.8 to white at 2.2}]
(0,0) circle (2.2) circle (1.8);
\shade[even odd rule,ring shading={from lime at 0.5 to blue at 1.3}]
(2,0) circle (0.5) circle (1.3);
\end{tikzpicture}
\end{document}
由 Andrew Stacey 添加 - 发布代码的评论很糟糕这是根据对其来源的调查得出的精简版本.8818cm
。
\tikzset{
ring shading/.code args={from #1 at #2 to #3 at #4}{
\pgfmathsetmacro{\inner}{25*#2/#4}
\pgfmathsetmacro{\innerlow}{\inner-1}
\pgfdeclareradialshading{ring}{\pgfpoint{0cm}{0cm}}%
{
color(0bp)=(white);
color(\innerlow bp)=(white);
color(\inner bp)=(#1);
color(25bp)=(#3);
color(50bp)=(black)
}
\pgfkeysalso{/tikz/shading=ring}
},
}