![是什么使得带星号的图形对象和其对偶的剪辑产生不同的结果?](https://linux22.com/image/265883/%E6%98%AF%E4%BB%80%E4%B9%88%E4%BD%BF%E5%BE%97%E5%B8%A6%E6%98%9F%E5%8F%B7%E7%9A%84%E5%9B%BE%E5%BD%A2%E5%AF%B9%E8%B1%A1%E5%92%8C%E5%85%B6%E5%AF%B9%E5%81%B6%E7%9A%84%E5%89%AA%E8%BE%91%E4%BA%A7%E7%94%9F%E4%B8%8D%E5%90%8C%E7%9A%84%E7%BB%93%E6%9E%9C%EF%BC%9F.png)
根据以下内容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
用 填充圆形并恢复图形状态,这样颜色/填充命令就从 中过滤掉了。grestore
clip
clipping path
另一方面,命令\pscircle*
生成不同的postscript
序列:
...
0 0 1 setrgbcolor 56.90549 56.90549 28.45274
1. .setopacityalpha SD clip
其中SD
代表0 360 arc fill
,因此颜色/填充命令保留在剪切路径中,并且显然它们是在剪切之后应用的。
答案2
剪报小路是闭合曲线和不是填充区域。使用星形版本进行剪切路径会产生意外行为