如何反转奇偶填充?

如何反转奇偶填充?

考虑以下代码。它使用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个问题:

  1. fillstyle=oefill,fillcolor=blue无法交换。换句话说,fillcolor=blue,fillstyle=oefill没有产生预期的结果。

  2. 输出会无意中移到右侧(请仔细查看上面给出的输出)。可能是因为没有通过 禁用空格%

  3. 新月状区域不再透明,因为它们已被纯白色填充。
  4. 使用奇偶规则进行剪辑是不可能的,因为/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)

相关内容