Tikz:具有相交形状的奇偶规则

Tikz:具有相交形状的奇偶规则

我不知道如何使用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

执行结果如下:

结果看起来像问题中的图像

相关内容