Computergrafik - Übungen
W. Kurth, E. Roth
WS 2001/02
Einführungskurs PostScript
PostScript: Seitenbeschreibungssprache, entw. von Adobe Systems. Weite Verbreitung im Druckgrafik-Bereich.
Erlaubt Kombination von Textelementen und Vektorgrafiken; volle Mächtigkeit einer Programmiersprache.
Einlesen durch PostScript-Interpreter, dort Umsetzung in Rastergrafik für die Ausgabe (PS-Interpreter in vielen Druckern bereits fest implementiert).
PS-Viewer für den Bildschirm:
ghostscript (MS-Windows, OS-2 und Unix; Aladdin), ghostview (komfortabler Viewer unter MS-Win. und OS-2; Ghostgum) - Shareware; xpsview (Unix).
Download:
http://www.cs.wisc.edu/~ghost/PostScript-Programme: lesbare ASCII-Dateien.
Grundprinzip:
Operanden werden nacheinander auf einen Stack abgelegt, Befehle werden nach den Operanden eingegeben und beziehen sich immer auf die obersten Stack-Elemente.
Funktionsargumente werden vom Stack geholt.
Beispiele:
17 4 add
% Addition 17+4
1 add
% Inkrementierung d. obersten
Stackelements um 1
42 100 moveto
% Bewegung des virtuellen Stiftes an
den Punkt (42; 100)
5 { 3 4 rlineto } repeat
% Schleife (Argumente:
Iterationszahl, iterierte Prozedur)
Datentypen:
Integer übliche Schreibweise, erweitert
(optional) durch
Basis#Zahl
(z.B. 16#3f)
Real übliche Schreibweise, incl. E-Schreibweise
Boolean true, false
String (Hallo Welt!)
Array [ 3 42 0 ]
Sonderzeichen in Strings:
\b, \f, \n, \r, \t, \\, \(, \), \xxx (Oktalzahl) (vgl. Sprache C)Definition (incl. Deklaration und Initialisierung) einer Variablen:
Abstrakte Zeichenfläche, abstraktes (2D-) Koordinatensystem ("Weltkoordinaten").
Voreinstellung: Ursprung (0; 0) = linke untere Ecke
Einheitslänge: 1 Big Point (dot) =
1/72 Zoll = 0,35277... mm
Ausmaße des voreingestellten A4-Blattes: (596,59; 843,75) =
rechte obere Ecke.
Beispiele für erste Grafikbefehle:
100 500 moveto % Startpunkt anfahren
Ergebnis:
Schließen eines Polygonzuges (der Kreisbögen
enthalten kann):
closepath
10 setlinewidth % Setzen der
Liniendicke für nächstes
stroke
1 0 0 setrgbcolor % Setzen
der Zeichenfarbe auf
% Rot (RGB-Modell: (1; 0; 0) )
Ergebnis nach Einfügen vor stroke im letzten Beispiel:
Zum Füllen von Polygonen ist es notwendig, den aktuellen grafischen Zustand zu "retten" und später wiederherzustellen (Stack-Operationen!):
Aktuellen grafischen Zustand (Pfad u.a. Parameter) retten:
Beispiel:
wurde erzeugt mit folgendem PostScript-Programm:
80 80 moveto
1 setlinejoin
Ausgabe von Text:
/Arial findfont 24 scalefont setfont
Erzeugen eines neuen, leeren Strings auf dem Stack:
Länge
Arithmetik in PostScript:
3 4 mul % 3× 4
Erste 20 Fibonacci-Zahlen (1 1 2 3 5 8... ai ai+1 (ai+ai+1)...) ausgeben:
/Times
findfont 16 scalefont setfont
10 10 moveto
Ergebnis:
Aufgabe (noch ohne Wertung):
Schreiben Sie ein PostScript-Programm, das die ersten 20 Quadratzahlen (beginnend mit 1) untereinander aufschreibt. Dabei sollen die geraden Quadratzahlen rot, die ungeraden schwarz erscheinen.
Hinweis: Es gibt mehrere Lösungswege. Einige davon
könnten die folgenden Befehle verwenden:
pop entfernt oberstes Stackelement
dup dupliziert den obersten Wert auf dem Stack
exch vertauscht die beiden obersten Stack-Einträge
String stringwidth
legt Breite und Höhe (in pt) des Strings
als Wert auf dem Stack ab
Boolean Prozedur if Prozedur,
notiert in {...}, wird ausgeführt, wenn der boolesche Ausdruck
true liefert
Boolean Prozedur1 Prozedur2 ifelse
Wert1 Wert2 eq Test auf Gleichheit
Wert1 Wert2 ne Test auf
Ungleichheit
Wert neg bewirkt
Vorzeichenwechsel des Wertes
Startwert Inkrement Endwert Prozedur
for for-Schleife
Verlagerung des Koordinatenursprungs um (tx, ty):
tx ty translate
Beispiel:
0 1 100
Neuskalierung des Koordinatensystems mit Faktoren sx, sy:
sx sy
Beispiel: Ellipsen
3 setlinewidth
10 1 scale
25 300 20 0 360 arc
closepath
stroke
Ergebnis:
Rotation des Koordinatensystems um gegebenen Winkel:
Winkel
rotateBeispiel:
/Helvetica
findfont 18 scalefont setfont
100 100 moveto
(Gerade ) show
45 rotate
3 1 scale
(Quer) show
1 3 div 1 scale
-45 rotate
( Gerade) show
showpage
Weitere Befehle:
x y mod Modulus-Operation (Rest bei Division)
x y gt Test auf größer
x y ge Test auf größer oder gleich
x y lt Test auf kleiner
x y le Test auf kleiner oder gleich
x sin Sinus
x cos Cosinus
x atan Arcus tangens
x sqrt Quadratwurzel
x exp Exponentialfunktion
x ln Logarithmus (Basis e)
x log Logarithmus (Basis 10)
x floor größtes Ganzes kleiner-gleich x
x ceiling kleinstes Ganzes größer-gleich x
rand Zufallszahl
x y and logisches Und
x y or logisches Oder
x y xor logisches Entweder-oder
x not logische Verneinung
Arrays:
Array Prozedur forall wendet die Prozedur auf jeden Wert
aus dem Array an
Array num get holt den (num+1)-ten Wert aus dem
Array und legt ihn auf den Stack
Array num Wert put ersetzt den (num+1)-ten Wert des
Arrays durch Wert
Array aload entpackt Array komplett auf den Stack
w1 ... wn Array astore packt die Werte w1, ..., wn zu einem
Array zusammen
Stack:
clear alle Stackeinträge löschen
count legt Anzahl der Stackeinträge auf den Stack
num j roll Rotation d. obersten num
Einträge des Stacks
um j Einträge
Aufgabe (noch ohne Wertung):
Zeichnen Sie mit PostScript ein Wabenmuster (regelmäßiges Sechseck-Gitter).
Zurück zur Startseite der Vorlesung
Last modification: October 17, 2001