是什么使得带星号的图形对象和其对偶的剪辑产生不同的结果?

是什么使得带星号的图形对象和其对偶的剪辑产生不同的结果?

根据以下内容pstricks.tex

\def\solid@star{%
  \if@star
    \pslinewidth=\z@
    \psdoublelinefalse
    \def\pslinestyle{none}%
    \def\psk@fillstyle{\psfs@solid}%
    \let\psfillcolor\pslinecolor
  \fi}

带星号的对象

\xxx*[linecolor=<color>]

类似于

\xxx[fillstyle=solid,fillcolor=<color>,linestyle=none,linewidth=0]

然而,当我们用它们作为剪切路径时,这种相似性就不再成立了。在下面的例子中,一个红色实心矩形将被一个圆形剪切掉。

第一个剪辑使用带星号的版本\pscircle*[linecolor=blue]并生成蓝色圆圈。但第二个剪辑使用其对偶\pscircle[fillstyle=solid,fillcolor=blue,linestyle=none,linewidth=0]并生成红色圆圈。因此,第二个剪辑产生了预期的结果。

在此处输入图片描述

\documentclass[border=12pt]{standalone}
\usepackage{pstricks}

\begin{document}

\begin{pspicture}[showgrid=top](4,4)
    \psclip{\pscircle*[linecolor=blue](2,2){1}}
        \psframe*[linecolor=red](4,4)
    \endpsclip
\end{pspicture}
\qquad
\begin{pspicture}[showgrid=top](4,4)
    \psclip{\pscircle[fillstyle=solid,fillcolor=blue,linestyle=none,linewidth=0](2,2){1}}
        \psframe*[linecolor=red](4,4)
    \endpsclip
\end{pspicture}

\end{document}

是什么造成了这种差异?

答案1

您说得对,\pscircle*[linecolor=blue](2,2){1} 和的\pscircle[fillstyle=solid,fillcolor=blue,linestyle=none,linewidth=0](2,2){1} 结果都是相同的封闭蓝色圆圈。但是,相应命令的顺序postscript有所不同。命令\pscircle
...

0 360 arc closepath gsave 0 0 1  setrgbcolor
1. .setopacityalpha fill  grestore clip

首先构建圆形路径,用 保存当前图形状态gsave,设置color和,在 之前alpha用 填充圆形并恢复图形状态,这样颜色/填充命令就从 中过滤掉了。grestoreclipclipping path

另一方面,命令\pscircle*生成不同的postscript序列:

...

0 0 1  setrgbcolor 56.90549 56.90549 28.45274
1. .setopacityalpha  SD  clip

其中SD代表0 360 arc fill,因此颜色/填充命令保留在剪切路径中,并且显然它们是在剪切之后应用的。

答案2

剪报小路闭合曲线不是填充区域。使用星形版本进行剪切路径会产生意外行为

相关内容