Warum führt das Clipping mit einem mit einem Sternchen versehenen Grafikobjekt und seinem Dual zu unterschiedlichen Ergebnissen?

Warum führt das Clipping mit einem mit einem Sternchen versehenen Grafikobjekt und seinem Dual zu unterschiedlichen Ergebnissen?

Basierend auf dem Folgenden aus pstricks.tex,

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

markiertes Objekt

\xxx*[linecolor=<color>]

ist ähnlich wie

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

Diese Ähnlichkeit ist jedoch nicht mehr gegeben, wenn wir sie als Beschneidungspfad verwenden. Im folgenden Beispiel wird ein rotes, ausgefülltes Rechteck von einem Kreis beschnitten.

Der erste Ausschnitt verwendet die mit Sternchen versehene Version \pscircle*[linecolor=blue]und erzeugt einen blauen Kreis. Der zweite Ausschnitt verwendet jedoch die Dualversion \pscircle[fillstyle=solid,fillcolor=blue,linestyle=none,linewidth=0]und erzeugt einen roten Kreis. Der zweite Ausschnitt erzeugt also das erwartete Ergebnis.

Bildbeschreibung hier eingeben

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

Was macht diesen Unterschied?

Antwort1

Sie haben Recht, beides \pscircle*[linecolor=blue](2,2){1} führt \pscircle[fillstyle=solid,fillcolor=blue,linestyle=none,linewidth=0](2,2){1} zum gleichen geschlossenen blauen Kreis. Die Reihenfolge der entsprechenden postscriptBefehle ist jedoch irgendwie unterschiedlich. Befehl \pscircle
...

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

erstellt zuerst den kreisförmigen Pfad, speichert den aktuellen Grafikzustand mit gsave, setzt den aktuellen colorund alpha, füllt den Kreis und stellt den Grafikzustand mit grestoreunmittelbar vor dem wieder her clip, wodurch die Farb-/Füllbefehle aus dem herausgefiltert werden clipping path.

Andererseits \pscircle*erzeugt der Befehl eine andere postscriptSequenz:

...

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

wobei SDfür steht 0 360 arc fill, somit verbleiben die Farb-/Füllbefehle im Beschneidungspfad und werden offenbar nach dem Beschneiden angewendet.

Antwort2

ein AusschnittWegist eingeschlossene KurveUndnichtein gefüllter Bereich. Die Verwendung einer Sternversion für den Beschneidungspfad führt zu einem unerwarteten Verhalten

verwandte Informationen