2. Einführung in Processing
2.1. Processing
Processing basiert auf der bekannten Programmiersprache Java und ist eine
Programmiersprache, mit der sehr schnell grafische Formen, Animationen und Interaktionen
erstellt werden können. Dazu abstrahiert Processing noch mehr von der Funktionsweise
eines Computers als Java. Daher müssen beim Programmieren von Grafiken und
Animationen weniger technische Details beachtet werden als dies etwa bei Java oder C++
der Fall ist.
Dies macht Processing besonders in den Bereichen Architektur und digitale Medienkunst
sehr beliebt. Außerdem ist Processing deswegen auch sehr gut zum Einstieg ins
Programmieren geeignet und ermöglicht aufgrund der Ähnlichkeit zu Java später einen
leichten Umstieg auf Java und Java-ähnliche Sprachen wie C++ oder C#.
Die Processing IDE ist kostenlos für Windows, Linux und Apple Betriebssystemen verfügbar
und kann online von der offiziellen Processing-Website heruntergeladen werden:
https://processing.org/download/
Da sich die Installation sehr einfach und “straightforward” gestaltet, sei hier auf die offizielle
Installationsanleitung (Windows, Mac, Linux) unter der folgenden URL verwiesen:
https://processing.org/tutorials/gettingstarted/
TU Wien 1
Programmieren mit Processing
Kapitel 2: Einführung in Processing
Die Syntax ist vergleichbar mit der Grammatik d.h. der Rechtschreibung in einer natürlichen
Sprache. Wird die Syntax nicht eingehalten, wird in Processing eine Fehlermeldung
ausgegeben, da dann zum Beispiel Anweisungen nicht mehr korrekt erkannt werden. Dies
geschieht in der Konsole der Processing IDE bzw. im Bereich zwischen Texteditor und
Konsole.
In den meisten Fällen werden die Fehler richtig und eindeutig interpretiert in der Processing
IDE angezeigt. Manchmal jedoch muss der Fehler und die Fehlerstelle aus der
Fehlermeldung abgeleitet werden.
emantik eines Programms ist die Beschreibung seiner Wirkung. Das ist vergleichbar
Die S
mit der Bedeutung umgangssprachlicher Texte. Liegt ein Semantikfehler vor, kann ein
TU Wien 2
Programmieren mit Processing
Kapitel 2: Einführung in Processing
Programm zwar syntaktisch korrekt sein, aber sich anders verhalten, als erwünscht. Ein
Beispiel für Semantikfehler wäre etwa die Missachtung der Rangordnung der Operatoren,
z.B: a+b*c statt (a+b)*c
Da liegt kein Syntaxfehler vor, denn das Programm kann problemlos ausgeführt werden.
Das Ergebnis des Programms ist jedoch anders als “erwartet”.
Oder als Vergleich mit der deutschen Sprache: Der Satz “Zwei Joghurts sitzen im Keller und
stricken Benzin” ist rein grammatikalisch korrekt, ergibt aber inhaltlich keinen Sinn (vgl.
Semantik).
void setup() {
//Voreinstellungen
}
void draw() {
//die für das Zeichnen benötigten Code-Teile
}
Das Programm wird innerhalb dieser zwei Bereichen immer von oben nach unten
abgearbeitet. Aufgrund dessen ist es wichtig, in welcher Reihenfolge Sie die einzelnen
Befehlszeilen anführen.
void setup() {...} In diesem Bereich werden alle Voreinstellungen angegeben. Dieser
Bereich wird von Processing zu Beginn einmal (von oben nach unten) ausgeführt. Das
Zeichnen auf das Sketch-Fenster ist hier auch möglich, sollte aber wenn nicht anders
angegeben eher im d raw() erfolgen.
TU Wien 3
Programmieren mit Processing
Kapitel 2: Einführung in Processing
void draw() {...} wird im Anschluss ausgeführt und beinhaltet alle Code-Teile, die auf
das Sketch-Fenster gezeichnet werden sollen.
Auf diesen Programmaufbau und den Programmfluss in Processing wird in Kapitel 3 noch
detaillierter eingegangen.
2.1.4. Befehlsaufruf
Einfache Anweisungen bzw. Befehle können in Processing wie im nachfolgenden Beispiel
aussehen:
Ein Befehl beginnt immer mit dem Befehlsnamen, hier: text. Dieser wird gefolgt von runden
Klammern. In diesen runden Klammern eingeschlossen stehen sogenannte Argumente
oder Parameter. Diese beinhalten eine zusätzliche Information für den Befehl, um diesen
genauer zu beschreiben, zB welcher Text an welche Position des Sketch Fensters
geschrieben werden soll.
Anderes Beispiel:
Die Parameter geben an, an welcher Stelle das Rechteck positioniert werden soll (60, 50)
und welche Breite (70) und Höhe (100) das Rechteck hat.
Jeder Befehl und jede Anweisung endet in Processing mit einem Strichpunkt (;).
2.1.5. Koordinatensystem
Wie in vielen Bereichen der Informatik, ist auch in Processing das Koordinatensystem zur
grafischen Ausgabe anders ausgerichtet als in der Mathematik. Der Ursprung liegt im linken
oberen Eck und die positive y-Achse zeigt nach unten, wie die folgenden Abbildungen
visualisieren.
TU Wien 4
Programmieren mit Processing
Kapitel 2: Einführung in Processing
TU Wien 5
Programmieren mit Processing
Kapitel 2: Einführung in Processing
2.2. Grundformen
Das Zeichnen am Computer Bildschirm ist vergleichbar mit dem Zeichnen am Papier.
In Processing ist das Sketch-Fenster (Abbildung unten, links) die Zeichenfläche, auf welcher
die grafischen Ausgaben gemacht werden.
Das Sketch-Fenster ist in ein Pixelraster unterteilt. Die Breite und Höhe des Sketch-Fensters
werden mit size(b, h)
definiert, wobei b die Breite in Pixel (px) angibt und h die Höhe in
Pixel (px). Anm.: Pixel ist die kleinste Längeneinheit am Bildschirm und entspricht der
Ausdehnung eines Bildpunktes.
Beispiel:
size(100, 150);
setzt die Größe des Sketch-Fensters auf 100px Breite und 150px Höhe.
Mit dem obigen Beispiel können Bildpunkte (Pixel) von (0, 0) bis (99, 149) angesprochen
werden. Der Pixelraster kann auch als ein auf der x-Achse gespiegeltes Koordinatensystem
gesehen werden.
Hinweis: Es sind nur positive ganzzahlige Werte für Breite und Höhe des Sketch-Fensters
erlaubt. Negative Werte oder Dezimalzahlen lösen Fehlermeldungen aus.
TU Wien 6
Programmieren mit Processing
Kapitel 2: Einführung in Processing
Rechteck
Ein Rechteck wird mit dem Befehl rect() gezeichnet. Dieser benötigt als Parameter die x-
und y-Koordinate der Startposition sowie die Breite und Höhe des zu zeichnenden
Rechtecks. Als Startposition dient per default die obere linke Ecke des Rechtecks, ungleich
zum Text - da ist die Position unten links.
zeichnet ein Rechteck unter Angabe des oberen linken Eckpunkts (x, y) der Breite b und
der Höhe h.
Hinweis:
Standardmäßig besitzen geometrische Formen in Processing eine schwarze Kontur und
weiße Füllfarbe. Wie Konturen und Füllfarben geändert werden können, ist in weiterer Folge
in Kapitel 2 beschrieben
Beispiel:
Der Beispielcode zeichnet ein Rechteck mit dem linken oberen Eckpunkt bei (50, 50), 400px
Breite und 200px Höhe.
void setup() {
size(500, 300);
}
void draw() {
rect(50, 50, 400, 200);
}
Hinweis:
Wenn die Position oder Größe des geometrischen Objekts so gewählt wurden, dass sie sich
(teilweise) außerhalb der Leinwand befinden, wird nur der sichtbare Bereich gezeichnet.
Viereck
Ein Viereck hat vier Eckpunkte und wird mit dem Befehlsnamen quad() gezeichnet.
quad()
TU Wien 7
Programmieren mit Processing
Kapitel 2: Einführung in Processing
hat als Parameter die Koordinaten jedes einzelnen Eckpunktes. Achtung: Die Angabe der
Eckpunkte kann im Uhrzeigersinn oder gegen den Uhrzeigersinn erfolgen, es ist jedoch zu
beachten, dass die Eckpunkte des Vierecks in der angegebenen Reihenfolge miteinander
verbunden werden.
zeichnet ein Viereck mit den Eckpunkten (x1, y1), (x2, y2), (x3, y3), (x4, y4).
Beispiel:
Dieses Beispiel zeichnet ein Viereck mit den Eckpunkten (50, 50), (400, 100), (450, 250)
sowie (100, 200).
void setup() {
size(500, 300);
}
void draw() {
quad(50, 50, 400, 100, 450, 250, 100, 200);
}
TU Wien 8
Programmieren mit Processing
Kapitel 2: Einführung in Processing
Dreieck
Ein Dreieck wird über seine drei Eckpunkte definiert und mit dem Befehl triangle()
gezeichnet.
Jeder Eckpunkt wird mit seinen Koordinaten einzeln angegeben. Die Reihenfolge der Punkte
kann im Uhrzeigersinn oder gegen den Uhrzeigersinn verlaufen.
zeichnet ein Dreieck mit den Eckpunkten (x1, y1), (x2, y2) und (x3, y3).
Beispiel:
Dieses Beispiel zeichnet ein Dreieck mit den Eckpunkten (250, 50), (50, 200) und (400,
250).
void setup() {
size(500, 300);
}
void draw() {
triangle(250, 50, 50, 200, 400, 250);
}
Ellipse
Eine Ellipse wird mit den Befehlsnamen ellipse() gezeichnet. Die Parameter der Ellipse
sind deren Mittelpunkt (x- sowie y-Koordinate) sowie deren Breite und Höhe. Ein Kreis wird
in Processing als Sonderform einer Ellipse mit gleicher Breite wie Höhe gezeichnet.
zeichnet eine Ellipse mit Mittelpunkt (x, y), einer Breite b und Höhe h
.
Beispiel: Dieses Beispiel zeichnet eine Ellipse mit Breite 400 und Höhe 200 in die Mitte der
Leinwand.
TU Wien 9
Programmieren mit Processing
Kapitel 2: Einführung in Processing
void setup() {
size(500, 300);
}
void draw() {
ellipse(250, 150, 400, 200);
}
Das nachfolgende Beispiel zeichnet anstelle der Ellipse einen Kreis mit einem Durchmesser
von 200px.
void setup() {
size(500, 300);
}
void draw() {
ellipse(250, 150, 200, 200);
}
Bogen
Ein Bogen wird mit dem Befehl arc() gezeichnet. Der Bogen basiert auf einer Ellipse. Als
Parameter werden der Mittelpunkt des Bogens in Form der x- und y- Koordinaten (x, y)
angegeben, die Breite (b) und Höhe (h) sowie jene zwei Bogenwinkel (in Radiant), an denen
der Bogen beginnt (alpha) bzw endet (beta).
Anmerkung: Die Winkel sind nicht in Grad angegeben, sondern in Radiant, d.h. mit der
Länge des Bogens eines Kreises mit Radius 1, beginnend rechts und im Uhrzeigersinn. Die
Winkel in Radiant gehen von 0 bis 2 π . 2 π entspricht 360 Grad. In Processing kann man die
Konstante PI für den Winkel von 180 Grad verwenden.
zeichnet einen (elliptischen) Bogen mit Mittelpunkt (x, y), einer Breite b und Höhe h,
Anfangswinkel alpha und Endwinkel beta. Der Bogen wird im Uhrzeigersinn von alpha bis
beta gezeichnet.
TU Wien 10
Programmieren mit Processing
Kapitel 2: Einführung in Processing
void setup() {
size(500, 300);
}
void draw() {
arc(250, 150, 300, 200, 0, 5);
}
Hinweis: Der Winkel wird nicht wie möglicherweise gewohnt von oben im Kreis gemessen
sondern von rechts anfangend gemessen.
Für den Befehl arc() existieren zusätzlich mehrere Modi, je nachdem, ob ein Kreisbogen,
ein Kreissektor oder ein Kreissegment (mit oder ohne Kreissehne) gezeichnet werden soll.
Der entsprechende Modus wird optional als zusätzlicher Parameter am Ende angegeben.
Modus:
● PIE: Kreissektor (d. h. Bogen mit den zwei Radien zum Mittelpunkt)
● CHORD: Kreissegment
● OPEN: Kreissegment ohne Kreissehne
Alle verfügbaren Modi sind unter dem entsprechenden API-Eintrag für a rc() auf der
Processing Seite beschrieben: https://processing.org/reference/arc_.html
void setup() {
size(500, 300);
}
void draw() {
arc(250, 150, 300, 200, 1, 6, PIE);
}
TU Wien 11
Programmieren mit Processing
Kapitel 2: Einführung in Processing
void setup() {
size(500, 300);
}
void draw() {
rect(50, 50, 400, 200);
ellipse(250, 150, 400, 200);
}
Wird die Reihenfolge der Anweisungen für die Ellipse und das Rechteck umgedreht, dann ist
nur das Rechteck sichtbar. Die Ellipse wird vom Rechteck verdeckt.
void setup() {
size(500, 300);
}
void draw() {
ellipse(250, 150, 400, 200);
rect(50, 50, 400, 200);
}
TU Wien 12
Programmieren mit Processing
Kapitel 2: Einführung in Processing
2.4. Kommentare
Mit Kommentaren können Beschreibungen zu Programmteilen hinzugefügt werden, die eine
bestimmte Anweisung, eine Code-Zeile oder einen Code-Block näher beschreiben. Damit
kann die Lesbarkeit und Verständlichkeit von Programmen erhöht werden, was besonders
bei größeren Programmen, bei Teamarbeit oder wenn der Programmcode weitergegeben
werden soll, nützlich ist. Daher gehört das kurze, aber aussagekräftige, prägnante und
konsistente Kommentieren von Programm-Code zum guten Programmierstil.
Beispiel:
void setup() {
// Voreinstellungen
size(300, 300); //Groesse des Sketch-Fensters
/* Im Blockkommentar koennen mehrzeilige
Kommentare verfasst werden, etwa zur Beschreibung
eines nachfolgenden Code-Blocks
*/
}
TU Wien 13
Programmieren mit Processing
Kapitel 2: Einführung in Processing
void setup () {
size(500, 300);
}
void draw() {
fill(200, 100, 0);
rect(50, 50, 400, 200);
fill(50);
ellipse(250, 150, 400, 200);
}
Im Beispiel wird das Rechteck orange und die Ellipse dunkelgrau angemalt.
Wird nur ein einzelner Wert angegeben, wird dieser als Graustufenwert oder Farbwert in
Hexadezimaldarstellung interpretiert. Graustufen werden mit einem Wert zwischen 0
(Schwarz) und 255 (Weiß) angegeben. Je kleiner der Wert desto dunkler ist also die Farbe.
Die Hexadezimaldarstellung wird in der Form #RRGGBB angegeben.
Mit drei Parametern kann in Farbe gezeichnet werden, wobei die drei Werte für die
Farbkomponenten Rot, Grün und Blau (in dieser Reihenfolge) stehen. Jeder Wert von 0 bis
255 ist zulässig und gibt die Intensität der entsprechenden Farbe an. Das bedeutet, je
kleiner der Wert, desto dunkler die Farbkomponente. Werte kleiner als 0 werden mit 0
angenommen und Werte größer als 255 mit 255.
Um einfach den richtigen Farbmix für eine gewünschte Farbe zu finden, wählt man in der
Menüleiste unter Tool/Farbauswahl den Color Selector. Mit ihm können Sie leicht die RGB-
und die Hexadezimal-Werte für Ihre Wunschfarbe auslesen.
TU Wien 14
Programmieren mit Processing
Kapitel 2: Einführung in Processing
Wichtig ist, dass sobald eine Farbe gesetzt wurde, diese solange verwendet wird, bis eine
andere gesetzt wird. Hält man sich nicht daran, führt es zu Programmverhalten, das wir im
Folgekapitel genauer behandeln.
Der Hintergrund des Sketch-Fensters, also die Leinwandfarbe, kann mit background()
eingefärbt werden. Wie das folgende Beispiel zeigt, lassen sich hier auch wieder Farben und
Graustufen verwenden.
void setup() {
background(255);
size(500, 300);
}
void draw() {
fill(200, 100, 0);
ellipse(250, 150, 400, 200);
}
Die beiden Möglichkeiten zur Farbwahl können in einem Programm beliebig verwendet
werden.
TU Wien 15
Programmieren mit Processing
Kapitel 2: Einführung in Processing
Soll eine Form bzw. ein geometrisches Objekt nicht gefüllt werden, sondern transparent
sein, wird noFill() verwendet. Auch diese Anweisung muss vor der entsprechenden
geometrischen Form gesetzt werden. Zusätzlich zum Farbwert kann optional bei fill() als
weiterer Parameter ein Alpha-Wert für die Deckkraft (opacity) angegeben werden.
void setup() {
background(255);
size(500, 300);
}
void draw() {
fill(100, 150, 100);
ellipse(250, 150, 200, 300);
fill(200, 100, 0, 50);
ellipse(250, 150, 400, 200);
}
Der obige Code zeichnet eine leicht transparente Ellipse. Um die Transparenz zu
verdeutlichen wird eine zweite Ellipse mit höherer Deckkraft gezeichnet, sodass die
halbtransparente Ellipse diese halb überdeckt.
2.5.2. Konturen
Geometrische Formen haben in Processing standardmäßig eine schwarze Kontur. Diese
kann mit verschiedenen Anweisungen modifiziert werden. Will man beispielsweise
überhaupt keine Umrandung haben, bietet sich die Anweisung noStroke() an.
void setup () {
background(255);
size(500, 300);
}
void draw() {
noStroke();
fill(100, 150, 100);
ellipse(250, 150, 200, 300);
fill(200, 100, 0, 50);
ellipse(250, 150, 400, 200);
}
Alle Formen werden danach ohne Kontur gezeichnet. Will man für unterschiedliche Objekte
unterschiedliche Konturen haben, lässt sich das mit stroke() wieder einstellen. stroke()
beinhaltet als Parameter drei Werte für die Farbe oder einen Parameter für einen Grauwert
der Kontur. Das Setzen der Konturen verhält sich gleich wie das Setzen der Farben - die
Anweisung wird vor den entsprechenden Formen geschrieben.
TU Wien 16
Programmieren mit Processing
Kapitel 2: Einführung in Processing
void setup () {
background(255);
size(500, 300);
}
void draw() {
noStroke();
fill(100, 150, 100);
ellipse(250, 150, 200, 300);
stroke(0, 0, 255);
fill(200, 100, 0, 50);
ellipse(250, 150, 400, 200);
}
Weiters kann auch die Dicke der Kontur verändert werden durch strokeWeight(). Diese
Anweisung benötigt als Parameter einen Wert, der die Dicke des Randes in Pixel angibt.
void setup () {
background(255);
size(500, 300);
}
void draw() {
noStroke();
fill(100, 150, 100);
ellipse(250, 150, 200, 300);
stroke(0, 0, 200);
strokeWeight(20);
fill(200, 100, 0, 50);
ellipse(250, 150, 400, 200);
}
TU Wien 17
Programmieren mit Processing
Kapitel 2: Einführung in Processing
Die Processing API ist unter https://processing.org/reference/ zu finden. Hier werden alle
Befehle dokumentiert, ihre Syntax, Parameter und Funktionsweise beschrieben und deren
Verwendung anhand von Beispielen visualisiert. Alle bis jetzt aufgeführten Befehle sind in
den Kategorien Shapes im Unterkapitel 2D Primitives und Color im Unterkapitel Settings zu
finden.
Anhand von quad() ist die Struktur der API und die Beschreibung der einzelnen Befehle gut
ersichtlich. Der Eintrag ist auf der Processing Reference Seite unter Shape/2D
Primitives/quad() zu finden (siehe Abbildung).
TU Wien 18
Programmieren mit Processing
Kapitel 2: Einführung in Processing
TU Wien 19
Programmieren mit Processing
Kapitel 2: Einführung in Processing
TU Wien 20