Komplexe Figuren

mehrflächige Figuren

Bislang haben wir, um eine Figur zu zeichnen, jeweils mit der Anweisung m einen Anfangspunkt bestimmt, von diesem aus mit l und c Anweisungen den Umriss definiert, und die Figur schliesslich mit einer der Anweisungen f, s, S, b oder B gezeichnet. Eine Figur kann aber auch aus mehreren Flächen zusammengesetzt werden.

Im Grundsatz ist die Idee einfach: Zunächst wird der Umriss der ersten Fläche wie gehabt mittels m, l und c definiert. Daraufhin definiert man wiederum mittels m, l und c die zweite Fläche. Das wiederholt man, bis alle Flächen definiert sind. Dann erst folgt die Zeichenanweisung.

Eine Besonderheit gilt es noch bei den s und b Anweisungen zu beachten. Diese bewirken bekanntlich, dass der gesamte Umriss gezeichnet wird, auch wenn wir die letzte Gerade zurück zum Startpunkt nicht definiert haben. Sind mehrere Flächen definiert, so funktioniert dies aber nur für die letzte Fläche. Die übrigen Flächen bleiben „offen“. Für solche Fälle ist die h Anweisung nützlich. Sie definiert eine Linie vom aktuellen Punkt zum Startpunkt der aktuellen Fläche.

Genug der Rede. Hier ein Beispiel:

1 0 0 RG
0 g
100 150 m 150 200 l 200 150 l 150 100 l h
250 150 m 300 200 l 350 150 l 300 100 l b

zwei Rhomben

Gut und schön, aber was bringt und das in der Praxis? Nun, es ist die Grundlage für eine simple aber mächtige Technik:

Überschneidungen und Löcher

Besteht eine Figur aus mehreren Flächen, so können sich diese natürlich überschneiden. Rücken wir mal die zwei Rhomben von oben etwas zusammen:

1 0 0 RG
0 g
100 150 m 150 200 l 200 150 l 150 100 l h
150 150 m 200 200 l 250 150 l 200 100 l b

überlappende Rhomben

So weit, so unspektakulär. Aber ändern wir unser Beispiel doch leicht ab:

1 0 0 RG
0 g
100 150 m 150 200 l 200 150 l 150 100 l h
150 150 m 200 100 l 250 150 l 200 200 l b

überlappende Rhomben mit weisser Schnittfläche

Nun ist die Schnittfläche nicht mehr schwarz, sondern weiss. Genaugenommen ist sie nicht mehr Teil der Figur. Hätten wir in der entsprechenden Region vorher etwas gezeichnet, so wäre es durch die Schnittfläche hindurch sichtbar. Wir können Schnittflächen also nutzen, um Löcher in Figuren zu stanzen. Hier ein anderes Beispiel:

100 150 m 150 200 l 200 150 l 150 100 l
125 150 m 150 125 l 175 150 l 150 175 l f

Rhombus mit Loch

Wie aber definieren wir, ob die Schnittfläche ein Teil der Figur ist, oder nicht? Dafür gibt es zwei Regeln, zwischen denen wir wählen können:

Standardregel

In den obigen drei Beispielen habe ich die Standardregel verwendet. Nach dieser muss der PDF Interpreter die überschneidenden Flächen ermitteln, und zählen, bei wievielen der Umriss im Uhrzeigersinn, und bei wievielen im Gegenuhrzeigersinn definiert wurde. Ist die Anzahl identisch, so gilt die Schnittfläche nicht als Teil der Figur, und wird ausgestanzt. Übrigens: Die re Anweisung definiert das Rechteck immer im Gegenuhrzeigersinn.

Schauen wir uns die Beispiele oben nochmals an, so kann man erkennen, dass ich zunächst beide Rhomben im Uhrzeigersinn definiert habe. Bei den letzten beiden Beispielen hingegen habe ich den ersten Rhombus im Uhrzeigersinn, den zweiten im Gegenuhrzeigersinn definiert. Somit gab es je eine überschneidende Fläche im Uhrzeigersinn und Gegenuhrzeigersinn, wodurch die Schnittfläche nicht zur Figur gehört.

Diese Regel ist war mächtig, manchmal aber etwas unpraktisch. Darum gibt es noch eine einfachere, alternative Regel:

Gerade/Ungerade-Regel

Bei dieser Regel wird einfach die Anzahl der überschneidenden Flächen gezählt. Ist sie gerade, so ist die Schnittfläche nicht Teil der Figur, ansonsten schon. In den obigen Beispielen wäre die Schnittfläche also immer ausgestanzt worden.

Diese Regel ist in der Vektorgrafik wegen ihrer Einfachheit beliebt. Um sie in PDF zu verwenden, gibt es drei weitere Zeichenanweisungen:

f*b*B*
Fläche füllen mit der Gerade/Ungerade-Regel
Kombination von s und f*
Kombination von S und f*

Übrigens: Wird eine Fläche so definiert, dass sie sich selbst überschneidet, so werden ebenfalls obige Regeln angewendet. Dabei wird die sich selbst überschneidende Fläche mehrfach gezählt.

Clipping

Jedesmal wenn wir eine Figur zeichnen, können wir sie als Clipping (Ausschnitt) definieren. Alle folgenden Anweisungen werden nur noch so weit gezeichnet, wie sie sich innerhalb des Clipping befinden. Enthält die Figur dabei mehrere sichtbare Flächen, so gelten sie alle als Teil des Clipping (womit wir einen weiteren Nutzen für Figuren mit mehreren Flächen hätten).

Ein Clipping wirkt sich auch auf nachfolgende Clippings aus. Folglich lässt es sich nicht über eine zweite Definition wieder zurücksetzen. Für diesen Zweck müssen wir Gruppierung verwenden.

Um eine Figur als Clipping zu definieren müssen wir unmittelbar vor die Zeichenanweisung eine der Anweisungen W oder W* einsetzen. Erstere verwendet für Überschneidungen die Standardregel, letztere die Gerade/Ungerade-Regel.

Beispiel:

100 150 m 150 200 l 200 150 l 150 100 l
250 150 m 300 200 l 350 150 l 300 100 l W f

Damit zeichnen wir die beiden Rhomben aus dem ersten Beispiel, und definieren sie gleichzeitig als Clipping.

Oftmals will man nur ein Clipping definieren, ohne aber etwas zu zeichnen. Auf die Anweisungen W und W* muss aber zwingend immer eine Zeichenanweisung folgen. Für diesen zweck gibt es die „Zeichenanweisung“ n, welche gar nichts zeichnet. Um also die beiden Rhomben als Clipping zu definieren, ohne sie zu zeichnen, können wir folgendermassen vorgehen:

100 150 m 150 200 l 200 150 l 150 100 l
250 150 m 300 200 l 350 150 l 300 100 l W n

Textzeichnung

Sowohl in TrueType wie auch in Type1 Schriften (egal ob Postscript oder OpenType) sind die einzelnen Zeichen im Grunde komplexe Figuren wie oben beschrieben. Man kann sich das so vorstellen, wie wenn für jedes Zeichen eine Serie von m, l, c und h Anweisungen definiert wäre. Für Schnittflächen gilt dabei grundsätzlich die Standardregel1).

Wenn wir in PDF einen Text setzen, so wird für jedes Zeichen der Umriss bestimmt, und dieser anschliessend gefüllt, was der f Anweisung entspricht. Darum ist die Füllfarbe gleichzeitig die Textfarbe. Wir können das aber ändern, und zwar mit der Tr Anweisung. Diese erwartet einen Parameter mit einer Zahl. Folgende Zahlen sind dabei möglich:

0Zeichen füllen
1Zeichenumriss zeichnen
2Zeichen füllen und Umriss zeichnen
3nichts zeichnen

Die Tr Anweisung darf innerhalb und ausserhalb von Textobjekten stehen.

Zusätzlich ist es möglich, ein Textobjekt als Clipping zu definieren. Dabei gelten alle Zeichen des Textobjekts als Teil des Clipping. Dies wird ebenfalls mittels Tr definiert, und zwar über vier weitere mögliche Werte:

4Zeichen füllen (Clipping)
5Zeichenumriss zeichnen (Clipping)
6Zeichen füllen und Umriss zeichnen (Clipping)
7nichts zeichnen (Clipping)

In Zusammenhang mit Clipping gibt es eine zusätzliche Regel für Tr Anweisungen innerhalb von Textobjekten: Namentlich darf nicht innerhalb eines Textobjekts von einem Clippingmodus in einen normalen Zeichenmodus gewechselt werden. Hingegen ist es erlaubt, innerhalb eines Textobjekts von einem normalen Zeichenmodus in einen Clippingmodus zu wechseln. In diesem Fall gehören nur die nachfolgenden Zeichen des Textobjekts zum Clipping.

Beispiel:

q
0 g /F1 24 Tf
4 Tr BT 72 670 Td (Hallo ) Tj 5 Tr (Welt) Tj ET 0 Tr
0 0 1 rg 72 660 200 20 re f
Q
1) wobei der Type1 Standard vorschreibt, dass die Zeichen mit der Gerade/Ungerade-Regel gleich aussehen müssen
Software » wiki » pdf » grafik » komplexe_figuren.htm