我不知道如何使用even odd rule
来填充相交形状。这是期望的结果:
这是我的代码。我希望您能解释一下如何应用even odd rule
、何时使用clip
以及何时使用scope
,我曾在此类更简单的示例中看到过使用。谢谢!
\documentclass[border=3pt,tikz]{standalone}
% define the angle theta = pi/7
\def\theta{25.71}
% define the circle of radius 1
\def\shapeA{(0,0) circle (1cm)}
% define the annulus of radii 1 and 2
\def\shapeB{(0,0) circle (1cm) (0,0) circle (2cm)}
% define the annulus of radii 2 and 3
\def\shapeC{(0,0) circle (2cm) (0,0) circle (3cm)}
% define the intersecting lines
% attempted to group them for even-odd rule
%\def\shapeD{(180+\theta:3.5cm) -- (0,0) -- (\theta:3.5cm)}
%\def\shapeE{(-\theta:3.5cm) -- (0,0) -- (180-\theta:3.5cm)}
\def\shapeD{(-\theta:3.5cm) -- (0,0) -- (\theta:3.5cm)}
\def\shapeE{(180+\theta:3.5cm) -- (0,0) -- (180-\theta:3.5cm)}
\begin{document}
\begin{tikzpicture}[thick]
\fill[fill=lightgray, even odd rule] \shapeE \shapeB;
\fill[fill=lightgray, even odd rule] \shapeD \shapeA;
\draw \shapeA \shapeB \shapeC \shapeD \shapeE;
\end{tikzpicture}
\end{document}
答案1
你把事情复杂化了。
\documentclass[border=3pt,tikz]{standalone}
% define the angle theta = pi/7
\def\theta{25.71}
\def\shapeA{(0,0) circle (1cm)}
\def\shapeB{(0,0) circle (2cm)}
\def\shapeC{(0,0) circle (3cm)}
\def\shapeD{(-\theta:3.5cm) -- (0,0) -- (\theta:3.5cm)}
\def\shapeE{(180+\theta:3.5cm) -- (0,0) -- (180-\theta:3.5cm)}
\begin{document}
\begin{tikzpicture}[thick]
\begin{scope}
\clip \shapeC;
\fill[fill=lightgray, even odd rule] \shapeE \shapeB \shapeD \shapeA;
\end{scope}
\draw \shapeA \shapeB \shapeC \shapeD \shapeE;
\end{tikzpicture}
\end{document}
只需以简单的方式声明所有形状(例如,这里需要按原样声明圆形,而不是像您尝试的那样声明为环形)。然后用even odd rule
所有形状一起填充。
至于\clip
,这里您不想填充较大的圆圈外面,因此您scope
用 填充\clip \shapeC;
,这意味着,在您的scope
环境中,外面没有任何东西被绘制形状C。最后,你在scope
环境外面画出线条,让它们画在更大的圆圈外面。
答案2
由于已经有了一个不错的、可接受的答案,我可以随意使用MetaPost/MetaFun 中的nofill
和添加解决方案eofill
。主要是为了好玩,但我希望有人能用它!该文件是用 编译的context
。
\startMPpage[offset=3bp]
u:=1cm;
path circle[],line[];
for i=0 upto 2:
circle[i] = fullcircle scaled (2(i+1)*u);
endfor
line0 = ((-1,0)--(1,0)) rotated 360/28 scaled 4u;
line1 = line0 rotated (180-360/14);
nofill circle1;
nofill line0 -- line1 -- cycle;
eofill circle0 withcolor lightgray;
clip currentpicture to circle2;
for i=circle0,circle1,circle2,line0,line1:
draw i;
endfor
\stopMPpage
执行结果如下: