TikZ:奇偶规则和[旋转=角度]之间的问题

TikZ:奇偶规则和[旋转=角度]之间的问题

在使用维恩图交叉点创建练习时,如果通过旋转定义图案,则会出现掩蔽问题。

代码如下:

\documentclass[a4paper, 12pt]{article}
\usepackage{tikz}

\begin{document}

\def\ellipseA{(0,0) ellipse (20pt and 30pt)}
\def\ellipseB{[rotate=45] (0,0) ellipse (10pt and 20pt)}

\begin{tikzpicture}
    \fill[cyan,even odd rule] \ellipseB \ellipseA ;
    \draw \ellipseA \ellipseB ;
\end{tikzpicture}

\end{document}

在此处输入图片描述

如您所见,小椭圆正确遮罩,但旋转也会在遮罩时影响大椭圆(但不会在绘制轮廓时影响大椭圆)。这很令人困惑,但我相信有人确切知道如何解决这个问题。

我也尝试使用范围来避免此问题,但到目前为止没有任何积极效果。

编辑:

更奇怪的是,如果我对大椭圆添加旋转,那么问题就会更加令人困惑:

\def\ellipseA{[rotate=20] (0,0) ellipse (20pt and 30pt)}
\def\ellipseB{[rotate=45] (0,0) ellipse (10pt and 20pt)}

\begin{tikzpicture}
   \fill[cyan,even odd rule] \ellipseB \ellipseA ;
   \draw \ellipseA \ellipseB ;
\end{tikzpicture}

在此处输入图片描述

答案1

要限制选项的效果rotate,您应该{}在路径中使用范围(via)。例如:

\fill[cyan,even odd rule] { \ellipseB } { \ellipseA } ;

或者使用范围来定义省略号:

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
  \def\ellipseA{(0,0) ellipse (20pt and 30pt)}
  \def\ellipseB{{[rotate=45] (0,0) ellipse (10pt and 20pt)}}
  \fill[cyan,even odd rule] \ellipseB \ellipseA ;
  \draw \ellipseA \ellipseB ;
\end{tikzpicture}
\begin{tikzpicture}
  \def\ellipseA{{[rotate=20] (0,0) ellipse (20pt and 30pt)}}
  \def\ellipseB{{[rotate=45] (0,0) ellipse (10pt and 20pt)}}
  \fill[cyan,even odd rule] \ellipseB \ellipseA ;
  \draw \ellipseA \ellipseB ;
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

这只是说,无论你把剪切部分放在最前面还是最后,都没有关系。问题是变换(在本例中即旋转)会累积。因此,第二幅图仍然继承了第一幅图的旋转。避免这种情况的一种方法是使用某种“伴随”变换

\def\ellipseA{[rotate=20] (0,0) ellipse (20pt and 30pt) [rotate=-20]}
\def\ellipseB{[rotate=45] (0,0) ellipse (10pt and 20pt) [rotate=-45]}

添加路径后撤消旋转,顺序则无关紧要。

\documentclass[a4paper, 12pt]{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
    \def\ellipseA{[rotate=20] (0,0) ellipse (20pt and 30pt) [rotate=-20]}
    \def\ellipseB{[rotate=45] (0,0) ellipse (10pt and 20pt) [rotate=-45]}
  \begin{scope} 
    \fill[cyan,even odd rule] \ellipseB \ellipseA ;
    \draw \ellipseA \ellipseB ;
  \end{scope}   
  \begin{scope}[xshift=2cm] 
    \fill[cyan,even odd rule] \ellipseA \ellipseB ;
    \draw \ellipseA \ellipseB ;
  \end{scope}   
  \begin{scope}[xshift=4cm] 
    \draw[fill=cyan,even odd rule] \ellipseA \ellipseB ;
  \end{scope}   
  \begin{scope}[xshift=6cm] 
    \fill[cyan,even odd rule] \ellipseA \ellipseB ;
    \draw[fill=cyan,even odd rule] \ellipseA \ellipseB ;
  \end{scope}   
\end{tikzpicture}
\end{document}

在此处输入图片描述

最后两个例子表明这里不需要单独的\draw\fill路径。

答案3

好吧,我可能有点笨。我只是把奇偶规则颠倒过来用了。你必须把剪下的部分放在蒙版部分后面才能让它起作用;)

\def\ellipseA{[rotate=20] (0,0) ellipse (20pt and 30pt)}
\def\ellipseB{[rotate=45] (0,0) ellipse (10pt and 20pt)}

\begin{tikzpicture}
    \fill[cyan,even odd rule] \ellipseA \ellipseB ;
    \draw \ellipseA \ellipseB ;
\end{tikzpicture}

在此处输入图片描述

抱歉,我问了个愚蠢的问题,如果有必要,版主可以删除它,即使我认为它可能对那些将来犯同样错误的人有用。

相关内容