在使用维恩图交叉点创建练习时,如果通过旋转定义图案,则会出现掩蔽问题。
代码如下:
\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}
抱歉,我问了个愚蠢的问题,如果有必要,版主可以删除它,即使我认为它可能对那些将来犯同样错误的人有用。