Das Zeichnen von gefüllten Flächen

Es ist möglich, beliebige TEX-Ausgaben an einem geschlossenen Kurvenzug, unabhängig davon, aus welchen Teilen er besteht, zu kappen. Eine Demonstration dieser Möglichkeit stellt Abbildung A.11 dar, die eine Fläche enthält, die von einem Spline und einem Polygonzug begrenzt ist und mittels Kappen an der Begrenzungslinie mit einer \hrule gefüllt wurde.

Abbildung: Gefüllte Fläche
\begin{figure}\centering
\begin{picture}(110,110)(0,0)
\setlinecap{round arrow}
...
...height 110pt depth 110pt}\endclip
\special{gr dot 0-3}
\end{picture}\end{figure}

Das Füllen geschieht durch Angabe eines Clippfades und beliebigen TEX-Ausgaben, die bezüglich dieses Pfades gekappt werden.

Die Definition des Clippfades geschieht mit dem Befehl defclip, der den Beginn eines Clippfades markiert und mit dem Befehl clip, der den Clippfad abschließt und gleichzeitig das Kappen einschaltet. Wird statt clip der Befehl whiteclip verwendet, wird das Innere des Clippfades gelöscht. Alle folgenden Ausgaben werden bezüglich dieses Pfades gekappt, bis der endclip-Befehl das Kappen ausschaltet.

Zur einfacheren Handhabung von Füllmustern betrachten Sie bitte die zwei Macros fill(x,y){} und sfill(x,y){}, die folgendermaßen definiert sind:

\newbox\fillbox
\newdimen\fillshift
\newdimen\fillwidth

\def\fill(#1,#2)#3{\setbox0\hbox to #1\unitlength{
  \cleaders\hbox{#3}\hfil}\loop
  \ifdim\ht\fillbox<#2\unitlength\setbox\fillbox
  \vbox{\unvbox\fillbox\copy0}\repeat\hbox to 0pt{
  \vbox to 0pt{\vss\box\fillbox\vglue0pt}\hss}}

\def\sfill(#1,#2)#3{\setbox0\hbox{#3}%
  \fillshift=0.5\wd0\fillwidth=#1\unitlength\loop
  \ifdim\ht\fillbox<#2\unitlength\setbox\fillbox\vbox{
  \unvbox\fillbox\hbox to\fillwidth{\cleaders\hbox{#3}
  \hfil}}\advance\fillwidth by\fillshift\fillshift=
  -\fillshift\repeat\hbox to 0pt{\vbox to 0pt{\vss\box
  \fillbox\vglue0pt}\hss}}

Ausgehend von der aktuellen Position wird ein rechteckiger Bereich der Breite x und Höhe y mit dem jeweiligen beliebigen Parameterinhalt überdeckt. Bei Verwendung von fill wird der Parameter in aufeinanderfolgenden Zeilen direkt untereinander gedruckt, bei sfill dagegen etwas seitlich verschoben.

Als Anwendung der Füllbefehle betrachten Sie bitte folgenden LATEX-Code, mit dem Abbildung A.11 erzeugt wurde:

\begin{figure}[hbp]\centering
\begin{picture}(110,110)(0,0)
  \special{gr setlinecap round arrow}
  \put(0,0){\special{gr setpoint 0}}
  \put(110,0){\special{gr setpoint 1}
  \special{gr spline 0-1}}
  \put(0,110){\special{gr setpoint 1}
  \special{gr spline 0-1}}

  \special{gr setlinecap arrow arrow}
  \put(10,10){\special{gr setpoint 0; dot 0}}
  \put(50,40){\special{gr setpoint 1; dot 1}}
  \put(90,20){\special{gr setpoint 2; dot 2}}
  \put(40,30){\special{gr setpoint 3; dot 3}}
  \special{gr defclip; spline 0-2;
    poly 2,3,0; clip}
  \put(0,0){}\vbox{\hrule width 110pt
    height 110 pt depth 110pt}\special{gr endclip}
\end{picture}
\caption{Gef"ullte Fl"ache}
\end{figure}

Natürlich ist es manchmal lästig, sich ein Füllmuster als TEX/LATEX-Code auszudenken, weil sich Füllmuster oft als Bitmap leichter definieren lassen. Wenn Sie anstelle der clip- bzw. whiteclip-Befehle den patclip-Befehl verwenden, wird der Clipbereich mit einem durch defpattern angegebenen Füllmuster gefüllt. Die Parameter dieses Befehls sind genau acht Bytes, die das Füllmuster spezifizieren. Im Moment sind also auch nur Füllmuster mit 8×8-Pixeln möglich. Die Bytes selbst werden als Dezimalzahl angegeben und jedes gesetzte Bit entspricht einem gesetzten Pixel im Füllmuster. Erinnern Sie sich noch an Abbildung 4.1? Die Realisierung dieses Bildchens mit Treiber-Befehlen sieht wie folgt aus:

\setdefaults\setunitlength{1bp}
\begin{picture}(354,100)(0,0)
  \put(0,0){\setpoint{0}}
  \put(100,100){\setpoint{1}}
  \put(354,0){\setpoint{2}}
  \defpattern{170,85,170,85,170,85,170,85}
  \defclip\closedpoly{0-2}\patclip\endclip
  \setlinewidth{1 pt}\closedpoly{0-2}
\end{picture}

Das Ergebnis können Sie in Abbildung A.12 bewundern.

Abbildung: Anwendungsbeispiel für defpattern, patclip
\begin{figure}\centering
\setdefaults\setunitlength{1bp}
\begin{picture}(354,100...
...}\patclip\endclip
\setlinewidth{1 pt}\closedpoly{0-2}
\end{picture}\end{figure}

Als kleines Bonbon folgt noch die etwas umfangreichere Abbildung A.13, damit Sie sehen, was Sie jetzt beispielsweise zeichnen können, falls Ihnen nicht gerade eine TEX-Implementation mit Speicherbeschränkungen den Spaß verdirbt (TEX capacity exceeded ...).

Abbildung: Augsburg University
\begin{figure}\centering\par
\newbox\fillbox
\newdimen\fillshift
\newdimen\fil...
...,3){P}}
\put(40,93){\rect(5,6)(0,1,2,3){P}}
\end{picture} % LaTeX
}
\end{figure}