考虑以下代码。它使用eofill
填充规则,其中仅填充由奇数个笔划界定的区域。是否可以反转此规则,以便填充由偶数个笔划界定的区域?
\documentclass[pstricks,border=12pt]{standalone}
\begin{document}
\begin{pspicture}[linewidth=2pt](6,4)
\pscustom[fillcolor=blue,fillstyle=eofill,linestyle=none]
{
\psellipse(4,2)(2,2)
\moveto(4,2)
\psellipse(2,2)(2,2)
}
\psellipse[linecolor=yellow](4,2)(2,2)
\psellipse[linecolor=green](2,2)(2,2)
\end{pspicture}
\end{document}
注意:请不要建议使用裁剪或交叉的解决方案。欢迎使用 TikZ 和 Asymptote 回答!
答案1
这Postscript 语言参考例如,没有提供奇偶规则(oefill
)对应奇偶规则(eofill
)。因此,您必须找到一种方法来重新追踪整个区域 - 特定于形状 - 以便“奇数”区域变为“偶数”,“偶数”区域变为“奇数”。
\documentclass[pstricks,border=5pt]{standalone}
\usepackage{pstricks}% http://tug.org/PSTricks/main.cgi/
\begin{document}
\begin{pspicture}[linewidth=2pt](6,4)
\pscustom[fillcolor=blue,fillstyle=eofill,linestyle=none,linewidth=0pt]
{%
\psellipticarc(2,2)(2,2){60}{-300}% Left (complete) ellipse/circle
\psellipticarc(4,2)(2,2){120}{-240}% Right (complete) ellipse/circle
\psellipticarc(2,2)(2,2){60}{-60}% Left (incomplete) segment
\psellipticarc(4,2)(2,2){-120}{120}% Right (incomplete) segment
}%
\psellipse[linecolor=yellow](4,2)(2,2)
\psellipse[linecolor=green](2,2)(2,2)
\end{pspicture}
\end{document}
重新创建和重新描绘形状的四个构造阶段需要一些解释:
- 绘制形状的奇怪角度(例如,从 60 到 -300,跨越 360 度)是为了欺骗 TeX 绘制完整的旋转。从 60 到 60 绘制圆弧会使它不存在。
- 选择围绕交叉点绘制这些弧是因为笔的移动可能会导致输出中出现一些瑕疵(细线的宽度为零,但仍会在某些缩放级别显示)。将焦点集中在作为形状之间交换的交叉点上可以消除这种令人讨厌的瑕疵。
答案2
\documentclass[pstricks,border=12pt]{standalone}
\begin{document}
\begin{pspicture}[linewidth=2pt](6,4)
\pscustom[linestyle=none,fillstyle=eofill]{% NO fillcolor
\psellipse(4,2)(2,2)\psellipse(2,2)(2,2)
\fill[fillcolor=red,fillstyle=solid]
}
\psellipse[linecolor=yellow](4,2)(2,2)
\psellipse[linecolor=green](2,2)(2,2)
\end{pspicture}
\end{document}
pstricks.tex
或使用当前http://texnik.dante.de/tex/generic/pstricks/
\documentclass[pstricks,border=12pt]{standalone}
\begin{document}
\begin{pspicture}[linewidth=2pt](6,4)
\pscustom[linestyle=none,fillstyle=oefill,fillcolor=blue]{% color _after_ style!
\psellipse(4,2)(2,2)\psellipse(2,2)(2,2)
}
\psellipse[linecolor=yellow](4,2)(2,2)
\psellipse[linecolor=green](2,2)(2,2)
\end{pspicture}
\end{document}
答案3
最新的pstricks.tex
提供了一个实验值oefill
,它是的补充eofill
。
\documentclass[pstricks,border=12pt]{standalone}
\begin{document}
\begin{pspicture}[linewidth=2pt,showgrid](6,4)
\pscustom[fillstyle=oefill,fillcolor=blue,linestyle=none]
{
\psellipse(4,2)(2,2)
\moveto(4,2)
\psellipse(2,2)(2,2)
}
\psellipse[linecolor=yellow](4,2)(2,2)
\psellipse[linecolor=green](2,2)(2,2)
\end{pspicture}
\end{document}
但存在4个问题:
fillstyle=oefill,fillcolor=blue
无法交换。换句话说,fillcolor=blue,fillstyle=oefill
没有产生预期的结果。输出会无意中移到右侧(请仔细查看上面给出的输出)。可能是因为没有通过 禁用空格
%
。- 新月状区域不再透明,因为它们已被纯白色填充。
- 使用奇偶规则进行剪辑是不可能的,因为
/oeclip
不存在。
答案4
用白色填充“清除”不需要的部分怎么样?
\pscustom[fillcolor=blue,fillstyle=solid,linestyle=none]
{
\psellipse(4,2)(2,2)
\moveto(4,2)
\psellipse(2,2)(2,2)
}
\psellipse[linecolor=yellow](4,2)(2,2)
\psellipse[linecolor=green](2,2)(2,2)
\pscustom[fillcolor=white,fillstyle=eofill,linestyle=none]
{
\psellipse(4,2)(2,2)
\moveto(4,2)
\psellipse(2,2)(2,2)
}
\psellipse[linecolor=yellow](4,2)(2,2)
\psellipse[linecolor=green](2,2)(2,2)
?