O que faz com que o recorte com objeto gráfico estrelado e seu duplo produzam resultados diferentes?

O que faz com que o recorte com objeto gráfico estrelado e seu duplo produzam resultados diferentes?

Com base no seguinte retirado de pstricks.tex,

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

objeto estrelado

\xxx*[linecolor=<color>]

é similar a

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

No entanto, essa semelhança não é mais mantida quando os usamos como traçado de recorte. No exemplo a seguir, um retângulo sólido vermelho será cortado por um círculo.

O primeiro recorte usa a versão com estrela \pscircle*[linecolor=blue]e produz um círculo azul. Mas o segundo recorte usa seu dual \pscircle[fillstyle=solid,fillcolor=blue,linestyle=none,linewidth=0]e produz um círculo vermelho. Portanto, o segundo recorte produz o resultado esperado.

insira a descrição da imagem aqui

\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}

O que faz essa diferença?

Responder1

Você está certo, ambos \pscircle*[linecolor=blue](2,2){1} resultam \pscircle[fillstyle=solid,fillcolor=blue,linestyle=none,linewidth=0](2,2){1} no mesmo círculo azul fechado. No entanto, a ordem dos postscriptcomandos correspondentes é um pouco diferente. Comando \pscircle
...

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

constrói o caminho circular primeiro, salva o estado gráfico atual com gsave, define os conjuntos atuais colore alpha, preenche o círculo e restaura o estado gráfico grestorelogo antes de clip, portanto, os comandos de cor/preenchimento são filtrados do clipping path.

por outro lado, o comando \pscircle*gera postscriptuma sequência diferente:

...

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

ondeSD significa 0 360 arc fill, portanto, os comandos de cor/preenchimento permanecem no caminho de recorte e, aparentemente, são aplicados após o recorte.

Responder2

um recortecaminhoé umcurva fechadaenãouma área preenchida. Usar uma versão em estrela para o traçado de recorte produz um comportamento inesperado

informação relacionada