- Erkläre die Bedeutung folgender Symbole und Programmanweisungen:
boolean for >= % int <= && char
| | ‚ { ++ String } += „“ = – ; ==
— if != -= // else > * /* */ while < / - Wieviel bit Speicher reserviert eine Variable vom Typ boolean?
a) 32 c) 16
b) 8 d) 1 - Was ist das Ergebnis des folgenden Programms?
int a=0;
for (int i=0; i<5; i++){
a++;
a += i+1;
}a) 10 c) 20
b) 15 d) 0
- Nimm 2 Variablen, x und y. Wir wollen nun die Ausganswerte vertauschen, also von x nach y und von y nach x übertragen. Welches der folgenden Programme macht das?
- x = y;
y = x; - tempX = x;
tempY = y;
x = tempX;
y = tempY; - y = x;
tempX = x;
x = tempX; - tempX = x;
x = y;
y = tempX;
- x = y;
- Schreibe Programme, die folgende Ausgaben produzieren:
Tipp: Verwende Schleifen und Modulo(%)

- Schreibe Programme, die folgende Ausgaben produzieren:
Tipp: Verwende sin() und cos()!


- Schreibe Programme, die folgende Ausgaben produzieren:
Tipp: Verwende random() und noise()!
- Schreibe Programme, die folgende Ausgaben produzieren:

- Schreibe den kürzest möglichen Code, der die folgenden Zahlenreihen ausgibt. Verwende dafür nur +, -, *, 0,
und %.
012340123401234
000010000100001
111101111011110 - Schreibe ein Programm, das den Mauszeiger auf einem 10 Punkte-Raster einschnappen lässt.
Tipp: Verwende dabei die round() Funktion.
Archiv der Kategorie: basics
Bedingungen mit Switch – Case
Processing 2.0
Mit switch / case kann man wie mit if / else Bedingungen programmieren. Während bei Verzweigungen mit weniger als 3 Möglichkeiten if / else die richtige Wahl ist, verwendet man bei Verzweigungen mit vielem Möglichkeiten besser switch / case.
switch (Variable) {
case Wert der Variable:
Anweisung1;
break; //notwendig, sonst würde auch die Anweisung 2 ausgeführt!
case Wert der Variable:
Anweisung2;
break;
case Wert der Variable:
Anweisung3;
break;
default:
Anweisung4;
}
Interessant ist dabei, dass die Ausführung der Anweisungen separat mit dem Befehl break abgebrochen werden muss. Andernfalls werden alle weiteren Anweisungen ausgeführt, selbst wenn die Bedingungen dafür nicht erfüllt sind.
Die default: Anweisung kann optional verwendet werden, falls man eine Anweisung ausführen will, wenn alle anderen Bedingungen nicht erfüllt werden. Entspricht somit der else – Funktion.
Beispiel Mausposition 1: starte Applet
void setup() {
size(500, 200);
}
void draw() {
// Nicht im Android Modus
//cursor(ARROW); //macht den Auszeiger in Form eines Pfeils sichtbar
background(200);
switch (round(mouseX/100)) {
case 0:
rect(0, 0, 100, 200);
break;
case 1:
rect(100, 0, 100, 200);
break;
case 2:
rect(200, 0, 100, 200);
break;
case 3:
rect(300, 0, 100, 200);
break;
case 4:
rect(400, 0, 100, 200);
break;
}
}
Beispiel Mausposition 2: starte Applet
void setup() {
size(500, 200);
}
void draw() {
// Nicht im Android Modus
//cursor(ARROW);//macht den Auszeiger in Form eines Pfeils sichtbar
background(200);
switch (round(mouseX/100)) {
case 0:
rect(0, 0, 100, 200);
case 1:
rect(100, 0, 100, 200);
case 2:
rect(200, 0, 100, 200);
case 3:
rect(300, 0, 100, 200);
case 4:
rect(400, 0, 100, 200);
} case
}
Um die Elementfolge von links nach rechts wachsen zu lassen, müsste man nur die case – Anweisungen in umgekehrter Reihenfolge platzieren.
Processing – Über dieses Weblog
Dieses Weblog gibt eine Einführung in die Programmierung mit Processing. Alle Artikel inkl. Quellcode werden gerade für Processing 2.0 überarbeitet.
Basics:
- Processing verwenden
- Die Programmstruktur
- Das Koordinatensystem
- Einfache Formen
- Variablen und Datentypen
- Strings
- Mathematische Operationen
- Mouse Input
- If-Anweisung
- Bedingungen mit switch – case
- Schleifen
- Textausgabe
- Tastatureingaben
- Mache jetzt: Projekt Ping Pong
- Farbe
- Fotos
- Zufall
- Winkel und Wellen
Advanced:
- Viele Arten ein Programm zu erstellen
- Funktionen
- Lesen und schreiben von Textdateien
- Transformationen
- Events
- Datenfelder (Arrays)
- ArrayLists()
- Vektoren
- Recursionen
- Objekte und Klassen
- Agenten
- Flocking
- Voronoi Diagramme
- 3D Basics
- 3D Oberflächen und Licht
- Shading
- Processing mit Eclipse entwickeln
Div. Skripts
- Easing
- Hochauflösende Bilder ausgeben
- Weichzeichnen (Blur)
- MySQL Datenbankanbindung mit PHP
- XML-Element
- try-catch Block
- Threads
- Geodaten und mehr mit Yahoo Query Language
- Geodaten auf Karte einzeichnen
Android Apps mit Processing erstellen:
- Android Grundlagen
- Erste App erstellen
- Multitouch
- Vibration
- OptionsMenü
- Erstellen einer .apk-Datei für den Market
- Processing Sketch in eine vollständige App einbinden
Kinect mit SimpleOpenNI:
Projekte:
- Ping Pong
- Rotations I
- Rotations II
- Rotations III
- Bild aus Text
- Voronoi und die französiche Revolution
- Facebook Anwendung I
- Android App Pure Pong!
- Korruption in der Demokratie
- 3D wie beim Magischen Auge
- Ziegenproblem
- Visualisierung von länderbezogenen Daten
- Visualisierung aus Textanalyse
- The Hunt
- Polarlichter
- Die Geburt der Sonne
Libraries
- Libraries verwenden
- Geomeratrive Library
- Twitter API für Processing
- PeasyCam
- Minim Sound abspielen
- Minim – Audio Analyse
- OpenCV Installation
- OpenCV Basics 1
- OpenCV Basics 2
- OpenCV Gesichtserkennung
Für Kommentare, Anregungen und Verbesserungsvorschläge bin ich jederzeit dankbar!
Projektseite: http://processing.org/
Hier findest du neben dem Programm selbst auch noch viele Anwendungsbeispiele, die Programm – Referenz und einige gute Tutorials für den Einstieg in Processing.
Processing verwenden
Processing 2.0
Processing kann von der Projektseite heruntergeladen werden. Einfach auspacken und starten.
In Processing 2.0 gibt es rechts oben einen Modus – Wahlschalter. Dieser bietet nach der Installation 3 Möglichkeiten:
- JAVA … Es wird ein Java Programm erstellt, das auf unterschiedlichen Plattformen in einem eigenen Programmfenster läuft.
- ANDROID … Es wird ein lauffähiges Programm für Android Devices erstellt. Diese können entweder im Emulator oder auf dem Device ausgeführt werden. Damit dieser Modus funktioniert ist allerdings die Installation der Android SDK notwendig! Eine Anleitung findest du hier! Details
- JAVASCRIPT … In diesem Modus wird der Java Programmcode in Javascript Code konvertiert. Dieser wird dann direkt mit Browser angezeigt, und kann in jede Webseite integriert werden. Details
In allen 3 Modi wird der Programmcode im Programmfenster geschrieben und kann über die Play-Taste ausgeführt werden.
Das Terminal-Fenster unten kann für Textausgaben benutzt werden.
Die Export-Funktion erzeugt je nach Modus ein ausführbares Programm für Desktops, eine Android App oder eine HTML Datei mit Javascript Elementen.
Die Programmstruktur
Processing 2.0
Ein klassisches Processing-Programm besteht aus 2 Funktionen. setup() und draw(), wobei der Code in setup() einmalig und der Code in draw() kontinuierlich ausgeführt wird. Jeder Durchlauf von draw() zeichnet ein Frame in das Anwendungsfenster.
Beispiel: Applet starten
void setup() {
size(300,300);
/*legt dir größe
des anwendungsfensters fest*/
}
void draw() {
rect(50,50,100,100); // zeichnet ein rechteck auf den schirm
}
Processing basiert auf Java und übernimmt auch dessen Syntax. Es wurde aber für eine bessere Usability bei grafischen Aufgaben um einige Elemente erweitert.
Kommentare: // einzeiliger Kommentar, /* */ mehrzeiliger Kommentar siehe Beispiel oben Anweisungstrennzeichen: „;“ – jede Programmanweisung sollte mit einem Strichpunkt abgeschlossen werden.
Funktionen: über sie kann man bestimmte Aktionen ausführen. Bsp: size(300,300). Funktionen werden immer von zwei runden Klammern gefolgt, innerhalb derer verschiedene Parameter zu finden sein können. Parameter können aber auch fehlen, Bsp: smooth();. Es ist auch möglich eigene Funktionen zu schreiben und diese dann in anderen Teilen des Programms aufzurufen, was die Übersichtlichkeit des Programmcodes deutlich erhöht.
Ausdrücke: Sind vielleicht aus der Mathematik bekannt und auch mit diesen zu Vergleichen. Ein Operator kombiniert dabei verschiedene Werte.
Bsp:
Ausdruck Wert
7 7
3+8 11
(12,8+179)*8 1534,4
7>5 true
6<3 false
Konsolenfenster: Um wichtige Werte auszugeben, die sich z.B. im Anwendungsfenster zu schnell ändern, kann man die Konsole benutzen. Bsp.: print(), oder println() Das folgende Beispiel gibt eine 10 im Konsolenfenster aus.
int x=10; println(x);
Zusätzliche Leerzeichen sind egal. Siehe Beispiel oben.
Groß- Klein- Schreibung beachten!!!
Das Koordinatensystem
Processing 2.0
In Processing wird von jeder Anwendung ein Fenster erzeugt, dessen Größe von der Funktion size(x,y) bestimmt wird. Der erste Wert x steht für die Anzahl der horizontalen Pixel, der 2. Wert y für die Anzahl der vertikalen.
size(640,480); //erzeugt somit eine Fenster mit 640*480 Bildpunkten
Auch alle anderen Funktionen, nutzen ein Koordinatensystem. Jeder Punkt wird von einer x- und einer y- Koordinate bestimmt.
point(200,200); //zeichnet einen Punkt auf 200 horizontal und 200 vertikal
Will man in 3D arbeiten, so kommt eine z-Achse hinzu. Siehe dazu: 3D Basics
Um das Programmfenster skalierbar zu machen verwendet man das Objekt frame. Dazu vielleicht später mehr. Durch die Zeile frame.setResizable(true); in setup() erhält man ein Programmfenster, das mit der Maus skaliert werden kann. Achtung funktioniert nur in Java Mode!
Einfache Formen
Processing 2.0
Punkt:
point(x,y);
Applet startenEin Punkt ist 1 Pixel groß und durch seine Position auf der x- und der y-Achse bestimmt.
Beispiel:Applet starten
point(10,20); //erster Punkt links oben, letzer point(20,30);//rechts unten point(30,40); point(40,50); point(50,60);
Punkte außerhalb des Displays werden nicht als Fehler behandelt, sondern einfach nicht angezeigt.
Übung: Schreibe ein Programm, das eine vertikale Linie aus Punkten von (10,10) bis (10,20) ausgibt.
Linie
line(x1,y1,x2,y2);
Zeichnet eine Linie von einem Anfangspunkt zu einem Endpunkt. Die Strichdicke kann nicht direkt in der Funktion line() eingestellt werden. Dafür gibt es die Funktion strokeWeight().
Beispiel: Applet starten

strokeWeight(2);//legt die Linienstäre auf 2 Pixel fest line(10,10,90,90); // zeichnet eine Line von (10,10) nach (90,90) strokeWeight(4); line(90,10,10,90);
Dreieck
triangle(x1,y1,x2,y2,x3,y3);
Zeichnet ein Dreieck zwischen den 3 Eckpunkten. Dieses kann, wie auch andere 2-dimensionale Objekte gefüllt werden. Dafür wird die Funktion fill() verwendet. Als Parameter für fill() kann entweder ein Grauwert (fill(255) wäre weiß), oder eine beliebige Farbe lt. RGB-Modell verwendet werden. fill(r,g,b), wobei r,g und b für die Rot, Grün und Blau-Werte von 0-255 stehen. Es können aber auch 2 Parameter angegeben werden, wobei der 2. für die Transparenz steht (0 – nicht durchsichtig, 255 völlig durchsichtig).
Siehe RGB Modell auf Wikipedia.
Beispiel: Applet starten

fill(227,16,16); //legt dir Füllfarbe für das // hintere Dreieck fest triangle(10,10,90,10,70,70); //hinten fill(255,230);//der 2. Wert definiert die Transparenz triangle(10,40,90,40,70,100);//vorne
Das Beispiel zeigt gut, dass jene Objekte, die im Code weiter unten generiert werden dann in der Darstellung im Vordergrund zu finden sind.
Viereck
quad(x1,y1,x2,y2,x3,y3,x4,y4);
Mit dieser Funkton lassen sich alle Arte von Vierecken erzeugen, auch Parallelogramme und irreguläre Vierecke.
Rechtecke
rect(x,y,width,height);
Rechtecke werden mit Hilfe des linken oberen Eckpunktes (x – und y- Koordinaten), der Breite und der Höhe bestimmt.
Übung: Erstelle ein Bild wie das unten. Verwende dafür die Funktionen size(), fill(), und rect(). 
Ellipse
ellipse(x,y,width,height);
Zeichnet Ellipsen und Kreise. Kreise entstehen dann, wenn widht und height gleich groß sind.
Übung: Erweitere die Abbildung oben mit ein paar runden Elementen.
Bezier
bezier(x1,y1,cx1,cy1,cx2,cy2,x2,y2);
Mit der Bezier- Funktion kann man Kurven erzeugen. Dies erfordert aber einige Übung. Prinzipiell funktioniert es wie die Vektor-Linienfunktion in Grafikprogrammen. Man definiert einen Punkt und lenkt durch einen 2. Punkt, der nicht Teil der Kurve ist die Linie ab.
Beispiel: Applet starten
void setup () {
size(640,480);
}
void draw (){
bezier(100,100,mouseX,mouseY,mouseX,mouseY,400,100);
}
Hier kann mit der Maus cx1,cy1, cx2 und cy2 verändern und bekommt so einen Eindruck wie Bezier- Kurven entstehen.
Hintergrund
background();
Diese Funktion legt die Hintergrundfarbe fest. Sie kann genau wie fill() als Parameter einen Graustufenwert oder aber Werte nach RGB-Modell beinhalten.
Hinweis: Wenn man die RGB- Werte von bestimmten Farben sucht, kann man unter Tools>ColorSelektor ein Fenster aufrufen, dass die RGB Werte von individuell ausgewählten Farben anzeigt.
Sonstiges:
noFill() verhindert das Füllen von 2 und 3-D Objekten, es werden nur die Konturen angezeigt.
noStroke() verhindert das Anzeigen der Ränder von Objekten.
smooth() aktiviert das Antialiasing – Kanten werden geglättet. In Processing 2.0 standardmäßig aktiviert!
noSmooth() deaktiviert Antialiasing
Variablen und Datentypen
Processing 2.0
Alle Daten im Computer werden irgendwann einmal in eine Folge 0er und 1er übersetzt. In Software sind Daten meist Buchstaben und Zahlen, aber auch Bilder, Musik und Video. In Processing kann man viele dieser verschiedenen Daten verarbeiten, aber nicht alle auf die gleiche Weise.
Datentypen
Sie legen fest, wie Daten in die Sprache des Computers (eine Reihe aus 0 und 1) übersetzt werden. Es gibt sog. primitive Datentypen, die in den meisten Programmiersprachen schon festgelegt sind. Darüber hinaus, kann man aber auch seine eigenen Datentypen erstellen.
Primitive Datentypen sind:
- int – 32 bit – Ganzzahlen von ca. -2 Mrd. bis ca. +2Mrd.
- float – 32 bit – Gleitkommazahl mit 8 Stellen Genauigkeit
- boolean – 1 bit – true oder false
- byte – 8 bit – -128 bis+127
- char – 16 bit – 0 bis 65535 für einzelne Zeichen
- color – 32 bit – 1.6777.216 Farben
Im Gegensatz zu den primitiven gibt es auch nicht primitive Datentypen (z.b. String), die bei Bedarf auch selbst definiert werden können. Beim Typ String kann man schon an der Schreibweise (groß) erkennen, dass er sich von den primitiven Datentypen unterscheidet. Und zwar dadurch, dass er, wie auch in Java üblich ein Objekt ist, dessen Eigenschaften durch eine Klasse definiert werden (zur genaueren Erklärung suche nach Objekte und Klassen). Schauen wir uns nun den Unterschied zwischen char und String genauer an. Während eine Variable vom Typ char ein Zeichen enthalten kann, ist kann ein String eine beliebige Anzahl an Zeichen (eine Zeichenkette) beinhalten. Ein weiterer Unterschied besteht in der Zuweisung der Werte.
char zeichen = ‚a‘; // deklariert die Variable zeichen und weist ihr den Wert a zu
char zeichen = „a“; // Error! ist nicht zulässig
String kette = „hallo welt!“; //Erzeugt ein Objekt vom Typ String mit dem Namen kette und weist diesem Objekt den Wert „hallo welt“ zu.
Variablen
Variablen sind Platzhalter im Speicher und können mit entsprechenden Werten beschrieben werden. Bevor ein Wert in einer Variablen gespeichert werden kann, muss diese „deklariert“ werden. Dabei wird ein entsprechender Datentyp für die Variable definiert. Bsp:
- int x; // deklariert die Variable x
- x=12; //weist der Variablen x den Wert 12 zu
- float z; //deklariert die Variable z
- z=3,14 //weist der Variablen z den Wert 3,14 zu
- boolean wahr;//deklariert die Variable wahr
- wahr=true;//weist der Variablen wahr den Wert true zu
Man kann das Ganze etwas abkürzen und Deklaration und Wertzuweisung in einem Schritt durchführen.
- int x=12;
- float z=3,14;
Eine Variable darf nur einmal deklariert werden, kann dann aber nacheinander verschiedenste Werte enthalten.
Variablenname dürfen frei gewählt werden, allerdings keine reservierten Ausdrücke sein (int, null, true, false usw.).
Processing hat einige vordefinierte Variablen, nämlich in size(): width and height. Wenn diese nicht anders definiert werden, haben sie den Wert 100. Deshalb ist das Anwendungsfenster in einem Programm ohne size(x,y) – Anweisung 100*100 px groß.
println(width + ", " + height); //gibt 100, 100 im Terminalfenster aus
Wenn man ein Programm für verschiedene Auflösungen schreiben will, ist es gut die Variablen width und height zu verwenden, da man dann allein mit der size() – Funktion die ganze Anwendung skalieren kann.
Beispiel:
size(300,300); rect(width/10,height/10,width/2,height/2); rect(width/4,height/4,width/2,height/2); ellipse(width/2,height/2,width/4, height/4);
Aufgabe: Schreibe ein Programm, das einige Variablen von den Typen char und String erzeugt und gibt diese mit der Funktion println im Konsolenfenster aus.
Mathematische Operationen
Processing 2.0
Da alles was in einer Anwendung gezeigt wird auf Nummern basiert, ist es unerlässlich, dass wir uns zumindest kurz ausschließlich mit diesen beschäftigen.
Beispiel: starte Applet
size(250,250); int grau=50; fill(grau); rect(20,20,100,100); grau=grau+50; fill(grau); rect(40,40,100,100); grau=grau+50; fill(grau); rect(60,60,100,100); grau=grau+50; fill(grau); rect(80,80,100,100); grau=grau+50; fill(grau); rect(100,100,100,100);
Hier wird mit Hilfe einer Variable der Grau-Wert der Quadrate definiert.
Beispiel: starte Applet
size(300,300); int x=2; //x ist jetzt 2 line(x,0, x,height); x=x*2;//x ist jetzt 4 line(x,0, x,height); x=x*2;//x ist jetzt 8 line(x,0, x,height); x=x*2;//x ist jetzt 16 line(x,0, x,height); x=x*2;//x ist jetzt 32 line(x,0, x,height); x=x*2;//x ist jetzt 64 line(x,0, x,height); x=x*2;//x ist jetzt 128 line(x,0, x,height); x=x*2;//x ist jetzt 256 line(x,0, x,height);
Hier werden Parameter der Funktion line() durch die Variable x kontrolliert.
Übung: Verändere das Programm Variablen so, dass es horizontale statt vertikale Linien zeichnet und lass die Linien immer um 2 Pixel dicker werden.
Modulo
In einem Programm kann man also ganz leicht alle Grundrechnungsarten anwenden. Oft ist es aber auch nötig den Rest einer Berechnung mit Ganzzahlen zu ermitteln. Dafür gibt es einen eigenen Operator. Dieser wird Modulo genannt und mit einem % geschrieben.
10 % 3 = 1
6 % 2 = 0
29 % 9 = 2
Natürlich können solche Berechnungen nur mit Zahlen des Datentyps int durchgefürht werden.
Datentypen können nicht beliebig kombiniert werden. Ein Ausdruck in der Form int x=4.0/3 liefert eine Fehlermeldung. float x=4.0/3 würde hingegen 1,3333334 ergeben. Die gleichen Ergebnisse kommen auch zustande, wenn die Zahlen durch Variablen mit den gleichen Werten ersetzt werden. Man muss also eigentlich immer genau wissen, welche Werte eine Variable annehmen kann.
Punktrechnung vor Strichrechnung
… gilt auch in Processing. Zudem kann man, wie auch in der Mathematik, Klammern setzen.
In der Kürze liegt die Würze
x++ steht für x=x+1;
y– für y=y-1;
x+=5 für x=x+5;
y-=5 für y=y-5;
usw.
Mathematische Funktionen
ceil();
Berechnet die nächste Ganzzahl aus einer Gleitkommazahl und rundet dabei immer auf.
floor();
Berechnet die nächste Ganzzahl aus einer Gleitkommazahl und rundet dabei immer ab.
round();
Berechnet eine Ganzzahl aus einer Gleitkommazahl. Dabei wird gerundet.
min(); und max();
Geben von beliebig vielen Zahlen als Parameter jeweils die größte oder die kleinste zurück.
Werte Normalisieren und Mappen
norm(Wert, niedrig, hoch);
Beim Normalisieren geht es darum Wertbereiche ineinander Umzuwandeln, bsp. einen Farbwinkel(0-360°) in einen Bereich zwischen 0 und 1. Die entsprechende Anweisung würde dann lauten: norm(Winkelx, 0, 360);
Der Vorteil des Zahlenbereichs zwischen 0 und 1 besteht darin, dass man die Zahlen beliebig multiplizieren und dividieren kann, ohne je den Bereich zu verlassen.
lerp(niedrig, hoch, norm.Wert);
Die lerp()-Funktion ist die Umkehrfunktion von norm(). Man gibt einen Bereich an und dann einen bereits normalisierten Wert (zwischen 0 und 1). Die Funktion gibt dann den, dem Bereich entsprechenden Wert zurück.
map(Wert, niedrig1, hoch1, niedrig2, hoch2);
Mit der Funtion map() kann man zwei beliebige Zahlenbereiche direkt ineinander umwandeln.
Mouse Input
Processing 2.0
Position des Mauszeigers
Natürlich kann Processing auch auf Benutzereingaben reagieren. Die Variablen mouseX und mouseY geben die aktuellen x- und y- Koordinaten des Mauszeigers zurück. Zu Beginn sind die beiden 0, das bleiben sie auch, wenn die draw()– Funktion nicht aufgerufen, oder mit noLoop() nur ein mal ausgeführt wird.
Beispiel: starte Applet
void setup() {
size(300,300);
noStroke();
}
void draw() {
background(50);
ellipse(mouseX,mouseY,30,30);
}
Übung: Erstelle ein Programm, in dem man mit einem weißen Stift einen dunklen Hintergrund anmalen kann.
Um festzustellen, ob die Maus sich bewegt hat, kann man die Variablen pmouseX (für previous) und pmouseY verwenden. Sie haben den Wert des Mauszeigers des vorangegangenen Frames. Wenn die Maus sich nicht bewegt sind also mouseX und pmouseX gleich. Bewegt sich die Maus, sind sie unterschiedlich.
Beispiel: starte Applet
</pre>
void setup() {
size(300,300);
strokeWeight(12);
}
void draw() {
background(50);
stroke(255);
line(mouseX,mouseY,pmouseX,pmouseY);
}
Übung: Mit der Funktion frameRate() kann man festlegen, wie schnell der Bildschirminhalt erneuert wird. Wert steht für Bilder/sek. Probiere das Programm mit verschiedenen FrameRate – Werten aus.
Mausbuttons
Dafür gibt es in Processing die Variable mousePressed, die bei gedrückem Mausbutton true, sonst false rückmeldet. Außerdem ist es möglich bis zu 3 Mausbuttons abzufragen. Das geht mit mouseButton und liefert die Werte LEFT, CENTER oder RIGHT.
Beispiel: starte Applet
Achtung: funktioniert nicht im Android Modus!
void setup() {
size(300,300);
}
void draw() {
background(200);
if (mousePressed) {
if (mouseButton == LEFT) {
fill(0);
} else if (mouseButton == RIGHT) {
fill(255);
} else {
fill(120);
}
ellipse(100,100,100,100);
}
}
Mauszeiger
Mit den Funktionen noCursor() und cursor() kann der Mauszeiger ein- und ausgeblendet werden. Ein individueller Mauszeiger kann mit Hilfe eines beliebigen Objekts und der Variablen mouseX und mouseY als Koordinatenangabe erstellt werden.
Aufgabe: Verändere das obige Programm so, dass es den Mauszeiger nicht mehr anzeigt.
Aufgabe: Schreibe ein Programm, das den Mauszeiger anzeigt und die Maus gleichzeitig ein Objekt bewegt, das aber in X und Y-Richtung nur immer 1/3 des Weges des Mauszeigers zurücklegt.
if – Anweisung
Processing 2.0
Bis jetzt sind unsere Programme immer von vorne nach hinten durchgelaufen, ohne auf irgend etwas zu reagieren.
Die if – Anweisung gibt uns die Möglichkeit Bedingungen für den weiteren Verlauf des Programms zu setzen. Das können true/false -Abfragen oder der Vergleich zweier Zahlen sein. Es sollten bei Zahlen immer nur Ganzzahlen (int) miteinander verglichen werden.
Vergleichsoperatoren:
> größer als
< kleiner als
>= größer oder gleich
<= kleiner oder gleich
== ist gleich (als Vergleich, einfaches = ist ein Zuweisungsoperator!!!)
!= ist nicht gleich
|| logisches oder
&& logisches und
! logisches nicht.
Für Anweisungen, die nur ausgeführt werden sollen, wenn bestimmte Bedingungen erfüllt sind, empfiehlt sich folgende Schreibweise:
if (test) {
Anweisungen
}
Wobei test für die Bedingung steht.
Beispiel: starte Applet
void setup(){
size(300,300);
}
void draw(){
background(200);
stroke(5);
fill(150);
if (mouseX<150 && mouseY<150){
rect(0,0,150,150);
}
else if (mouseX>150 && mouseY<150){
rect(150,0,150,150);
}
else if (mouseX<150 && mouseY>150){
rect(0,150,150,150);
}
else if (mouseX>150 && mouseY>150){
rect(150,150,150,150);
}
}
Als Struktogramm sieht das Programm so aus:
Viele Möglichkeiten ergeben sich dann,wenn man versucht mehrere Bedingungen ineinander zu verschachteln.
Logische Operationen
In Processing kann man 3 logische Operationen verwenden (&& logisches UND, || logisches ODER und ! logisches NICHT).
Diese Operationen kann man nun beliebig miteinander verknüpfen. Man nennt dies die Boolsche Algebra.
Schleifen
Processing 2.0
Mit Schleifen kann man unter anderem den Programmablauf steuern. Wir werden uns jetzt speziell mit der for-Schleife beschäftigen. Damit kann man den zu schreibenden Code beträchtlich verkürzen, was zu weniger Fehlern und besserem Überblick führt.
Beispiel (lang, ohne Schleife): starte Applet
size (300,300); line (10,10,190,10); line (10,20,190,20); line (10,30,190,30); line (10,40,190,40); line (10,50,190,50); line (10,60,190,60); line (10,70,190,70); line (10,80,190,80); line (10,90,190,90); line (10,100,190,100); line (10,110,190,110); line (10,120,190,120); line (10,130,190,130); line (10,140,190,140); line (10,150,190,150); line (10,160,190,160); line (10,170,190,170); line (10,180,190,180); line (10,190,190,190);
Beispiel (kurzer Code mit Schleife): starte Applet
size (300,300);
for (int i=10; i<width; i+=10) {
line (10,i,290,i);
}
Die Länge des Codes kann also in diesem Beispiel von 20 Zeilen auf 4 Zeilen verringert werden, ohne die Funktionsweise zu verändern.
Aufgabe: Schreibe ein Programm, das vom Mittelpunkt ausgehend immer größere Kreise auf den Schirm zeichnet. Das ganze sollte so ausshen: 
Tipp: verwende noFill(), um nur den Umriss der Ellipsen zu zeigen.
Es gibt nun die Möglichkeit, in Schleifen entweder Bedingungen zu verwenden, oder sie zu verschachteln.
Beispiel: starte Applet
size (300,300);
noFill(); //nur Umriss wird gezeigt
for (int i=10; i<width; i+=10) {
if (i%20==0){ //bleibt kein Rest bei der Division durch 20 --> Kreis
ellipse (width/2,height/2,i,i);
} else { //sonst --> Ellipse
ellipse (width/2,height/2,i+10,i);
}
}
Beispiel: starte Applet
size (300,300);
fill(127);
for (int x=10; x<width; x+=10) {
for (int y=10; y<height; y+=10) {
ellipse (x,y, 10, 10);
}
}
Hier werden für die x- und die y-Richtung je eine Schleife verwendet und Ellipsen mit 10 Pixel Radius auf den Schirm gezeichnet.
Aufgabe: Verändere das Programm so, dass die Größe der gezeichneten Ellipsen durch die Position der Maus veränder werden kann. Applet

Neben der for-Schleife gibt es auch noch die Möglichkeit einer while- Schleife. Sie wird vorwiegend in Fällen eingesetzt, in denen man von vorne herein nicht weiß, wie viele Schleifendurchläufe es geben soll.
Die while -Schleife wird durchlaufen, solange die jeweilig Bedingung erfüllt ist.
while (i>10) {
Anweisungen
}
Textausgabe
Processing 2.0
Bevor man Text in Processing ausgeben kann, muss man eine beliebige Schrift zuerst in das .vlw Format konvertieren (Processing –> Tools –> Create Font …).
Bei diesem Vorgang werden der oder die Buchstaben in der angegebenen Größe gerendert. D.h. sei liegen dann als Rastergrafik vor, was zur Folge hat, dass sie nicht mehr beliebig skalierbar sind, sonder man vorher überlegen muss, wie groß die Zeichen sein müssen. Die Rastergrafiken werden in einer .vlw – Datei im Sketch- Ordner des aktuellen Projektes gespeichert.
Alternativ dazu kann man auch im Programm eine Schrift erzeugen, dabei muss man beachten, dass auf einem anderen System die entsprechende Schrift vielleicht nicht installiert ist und sich daraus dann Probleme ergeben. Um Probleme auszuschließen kann mit der Methode Pfont.list() ein Array mit den, auf dem System verfügbaren Schriften erzeugen. Die Anweisung würde dann so aussehen:
String [] fontList=PFont.list();
font = createFont(„Miso“,12);
Im Android Mode sollte man aus Gründen der Effizienz immer die createFont() Funktion nutzen!
Um im Programm auf die Zeichen zugreifen zu können, gibt es einen eigenen Datentyp, nämlich PFont. Um Text auf dem Bildschirm ausgeben zu können, muss man eine Variable (genau genommen ein Objekt) vom Typ PFont erstellen und dann mit der Funktion LoadFont() die Zeichen laden. Mit textFont() muss die aktuelle Schrift ausgewählt werden. Um den Text dann anzeigen zu können benutzt man die Funktion text().
text(daten, x,y);
text(daten, x,y, breite, höhe);
Wobei daten alle Daten von den Typen String, char, int, float enthalten kann.
textSize();
Die Funktion textSize() legt die Schriftgröße fest. Wenn aber die gewählte Schriftgröße größer ist, als der Wert, mit dem die Schrift gerendert wurde, dann wird sie pixelig!
Beispiel: starte Applet
PFont font; //erstellt ein Pfont-Objekt mit dem Namen font
size(300,300);
font = loadFont("ArialMT-48.vlw"); //weist dem Objekt font die Grafiken für die einzelnen Buchstaben zu
textFont(font); //estellt ein Objekt textFont mit dem Parameter font
textSize(240);//setzt die Schriftgröße auf 180 Pixel
fill(255); //legt die Schriftfarbe fest
text(2, 80, 240); //gibt text auf dem Schirm aus
textSize(36);
fill(0);
text("lorem ipsum ...",20,70); //gibt text auf dem Schirm aus
Vorsicht: Bei exotischen Schriften stehen oft nicht alle Zeichen zur Verfügung (Zahlen und Umlaute).
Beispiel: starte Applet
PFont font; //erstellt ein Pfont-Objekt mit dem Namen font
size(300,300);
background(255);
font = loadFont("ArialMT-48.vlw"); //weist dem Objekt font die Grafiken für die einzelnen Buchstaben zu
textFont(font); //estellt ein Objekt textFont mit dem Parameter font
//setzt die Schriftgröße auf 180 Pixel
for (int i=1; i<10; i++) {
fill(0,220-i*20);
textSize(20+i*10);
text(i, i*30-30, 150); //gibt text auf dem Schirm aus
}
textLeading(abstand);
Abstand ist dabei der Abstand der Zeilen in Pixel.
textWidth(float);
Mit der Funktion textWidth() kann man die genaue Breite eines Strings (in Pixel) ermitteln.
textAlign(x-Richtung, y-Richtung);
Mit textAlign kann man die ein Textobjekt ausrichten, wie man das von der Textverarbeitung gewohnt ist. In der horizontalen x-Richtung sind die Parameter LEFT, CENTER und RIGHT möglich. In vertikaler Richtung TOP, BOTTOM, CENTER, und BASELINE.
Einen Zeilenumbruch im Fließtext erreicht man mit \n.
Aufgabe: Schreibe ein Programm, das deinen Nachnamen schön formatiert am Bildschirm ausgibt.
Aufgabe: Überlege Dir, wie man Buchstaben in Kreisform anordnen könnte! Versuche daraus ein Programm zu erstellen!
Tastatureingaben
Processing 2.0
Die einfachste Methode abzufragen, ob eine Taste auf der Tastatur gedrückt wurde, stellt die Variable keyPressed dar. Sie kann die Werte true oder false annehmen.
Beispiel: starte Applet
int x = 10;
void setup() {
size(300,300);
}
void draw() {
background(200);
if (keyPressed == true) {
x=x+1;
}
ellipse(x,100,10,10);
}
Drücke irgend eine Taste, um die Ellipse von links nach rechts zu bewegen. Im Android Mode muss man die virtuelle Tastatur aktivieren!
Die Variable key vom Typ char speichert jeweils die letzte Tastatureingabe.
Beispiel: starte Applet
Achtung: Die Grafiken für die Buchstaben müssen vor der Benutzung mit Processing –> Tools –> Create Font … erstellt werden.
PFont font; //erstellt ein Pfont-Objekt mit dem Namen font
void setup() {
size(300,300);
font = loadFont("ArialMT-48.vlw"); //weist dem Objekt font die Grafiken für die einzelnen Buchstaben zu
textFont(font); //estellt ein Objekt textFont mit dem Parameter font
}
void draw() {
background(200);
text(key,90,110); //gibt text auf dem Schirm aus
}
Im Android Mode muss man die virtuelle Tastatur aktivieren!
Die key-Variable kann benutzt werden, um zu prüfen, welche Taste gedrückt wurde. Hier ist es auch wichtig bei der Abfragen mit den logischen Operatoren && (logisches UND) und || (logisches ODER) zu arbeiten.
TIPP: weil alle Zeichen über den ASCII-Code festgelegt werden, kann man mit der Variable key auch rechnen. Sie gibt, dann den ASCII-Wert der letzten Tastatureingabe zurück.
Eine weitere Variable keyCode speichert ALT, CONTROL, SHIFT, UP, DOWN, LEFT und RIGHT. Bevor man diese codierten Tasten abfragt, sollte man mit key == CODED (hoffentlich true) abfragen, ob eine Taste codiert ist.
Farbe
Processing 2.0
Hier kommt bei Processing, wie bei vielen anderen Programmen zunächst das sog. RGB-Modell zum Einsatz. D.h. jede Farbe wird aus einem Rot-, Grün- und Blauwert zwischen 0 und 255 definiert. Konkret wird dann aus einer Mischung aller Farben mit der maximalen Intensität (255,255,255) –> Weiß und (0,0,0) ergibt Schwarz.
Wenn man alle drei Farben zu gleichen Teilen mischt, ist das Ergebnis immer ein Grauton. Seine Intensität ergibt sich aus der Intensitäten der Einzelfarben.
Mit den Funktionen
background(r,g,b);
fill(r,g,b);
fill(r,g,b,alpha);
stroke(r,g,b); und
stroke(r,g,b,alpha);
kann man die Eigenschaften der Elemente am Schirm definieren. Alpha definiert die Deckkraft eines Objekts (0…durchsichtig bis 255…volle Deckung).
Processing bringt im Menü unter Tools auch den Color Selector mit dem man Farben auswählen und dann deren RGB- und HSB- Werte ablesen kann.
Beispiel: starte Applet
Bewege deine Maus über die Animation und bestimme damit die Deckkraft der Farbkreise.
void setup()
{
size(300, 300);
noStroke();
}
void draw()
{
background(200);
fill(255,0,0,mouseX*2);
ellipse(150,100,150,150);
fill(0,255,0,mouseX*2);
ellipse(100,170,150,150);
fill(0,0,255,mouseX*2);
ellipse(180,170,150,150);
}
Beispiel: starte Applet
void setup() {
size(300, 300);
}
void draw() {
background(262, 202, 49);
for (int i=0; i<300; i++) {
stroke(0, 0, 255, i-(100));
line(i, 0, i, 300);
}
}
Aufgabe: Verändere den Code des letzten Beispiels so, dass sich der Übergang je nach Mausposition nach links und recht verschieben lässt.
Um den Umgang mit Farben noch etwas einfacher zu gestalten, kann man in Processing auf einen eigenen Datentyp, nämlich color() zugreifen. Damit kann man Farben, die man öfters verwendet Namen zuordnen. Die Farbdefinition funktioniert, wie sonst auch, als Grauwert oder RGB, mit oder ohne alpha-Wert.
Beispiel: starte Applet
Die Farbe des Rechtecks ändert sich je nach Mausposition von einer vorher definierten Farbe grün zu blau.
void setup() {
size(300, 300);
}
void draw() {
background(255,188,3);
color blue=color(3,206,255);
color green = color(195,255,3);
if (mouseX<150){
fill(blue);
} else {
fill(green);
}
rect(50,50,100,100);
}
Neben dem Standard-Farbmodell RGB kann man in Processing auch das HSB-Modell anwenden. Hier wird eine Farbe mit der Angabe des Farbtons (hue), der Farbintensität (straturation) und der Helligkeit (brightness) angegeben. Mit der Funktion colorMode(mode) kann man das Fabmodell wählen. Mode kann somit für RGB oder HSB stehen.
Beispiel: starte Applet
int a=1;
int c=1;
void setup(){
size(300, 300);
colorMode(HSB);
}
void draw(){
a++;
for(int i=0; i<width; i++){
c=(a+i)%255;
stroke(c,255,255);
line(i,0,i,300);
}
}
Aufgabe: Gestalte das Spiel Ping Pong farbig.
Fotos
Processing 2.0
Auch für Bilder bringt Processing mit PImage einen eigenen Datentyp mit. Um ein Bild auszugeben geht man also folgendermaßen vor: Man deklariert eine Variable (genauer ein Objekt) vom Typ PImage. Dann weist man ihr mit der Funktion loadImage(„dateiname“) einen Wert zu. Um sie dann anzuzeigen verwendet man die Funktion image(var, x, y, breite, höhe). Processing kann Bilder der Formate jpg, gif und png verarbeiten.
Beispiel: starte Applet
PImage foto;//deklariert die Variable foto;
void setup(){
size(300, 300);
foto = loadImage("blume.JPG");
//weist der Variablen foto die datei blume.jpg zu
}
void draw(){
image(foto, 0, 0, 300,300);
//gibt die Variable foto auf dem Bildschirm aus
}
Um Bilder zu verändern kann man beispielsweise die Funktion tint(); verwenden, die wie fill() und stroke() verwendet werden können.
Aufgabe: Schreibe ein Programm die Blume je nach Mausposition rot und grün einfärbt.
Will man komplexere Veränderungen vornehmen, kann man mit der Methode loadPixels() kann man die einzelnen Bildpunkte als Daten vom Typ Color in ein Array laden.
Siehe Projekt: Bild aus Text
Zufall
Processing 2.0
Auch in Processing gibt es Möglichkeiten Zufallszahlen zu erzeugen. Die einfachste Möglichkeit bietet hier die Funktion random(). Manchmal will man aber Zufallszahlen haben, die jeweils nur leicht voneinander abweichen, sowie in der Natur. Für diese Aufgabe gibt es die noise() – Funktion, die immer Zahlen zwischen 0 und 1 ausgibt. Durch den folgenden Parameter kann man nur die Größe der Abweichung von Zahl zu Zahl beeinflusst werden.
random(hoch, tief)
Beispiel: starte Applet
Von diesem Programm werden an zufälligen Positionen Ellipsen gezeichnet. Auch die Strichstärke ist variabel. Dadurch entstehen große und kleine Formen.
void setup()
{
size(300,300);
stroke(0,40);
}
void draw()
{
int x=int(random(300));
int y=int(random(300));
int z=int(random(10));
strokeWeight(z);
ellipse(x, y, 1,1);
}
randomSeed(Wert)
Mit randomSeed() und einem Integer als Wert kann man, wenn man will (und der Integer-Wert immer der gleiche ist) immer die gleiche Zufallszahlenreihe erzeugen.
Aufgabe: Schreibe ein Programm, das in etwa folgenden Output erzeugt.
noise(x,y,z)
Die noise– Funktion kann mit einem, zwei oder drei- Parametern aufrufen, je nachdem, ob man 1-,2- oder 3-dimensional arbeiten will. Erzeugt werden immer Zahlenwerte zwischen o und 1, die jeweils nur geringe Unterschiede zu den Zahlen davor aufweisen. Will man natürliche Vorgänge simulieren, ist diese Funtktion sehr sinnvoll.
Die Werte von x, y und z müssen, um unterschiedliche Zunoise– Funktionfallszahlen zu generieren bei jedem Durchlauf erhöht werden. Größe der Schritte definiert dann die Variabilität der Zahlenreihe. Für die meisten Anwendungen eignen sich Schritte von 0.005 bis o.1.
Beispiel: starte Applet
float v = 0.0;
float inc = 0.01;
float next= 0.01;
void setup()
{
size(300,300);
noStroke();
fill(50);
}
void draw()
{
translate(width/2, height/2);
float b = noise(v) * 5.0;
float n = next/1.0;
rect (next*cos(n)+b,next*sin(n)+b, 1, 1);
v=v+inc;
next = next+0.01;
}
Beispiel: starte Applet
float v = 0.0;
float inc = 0.01;
float next= 0.8;
void setup()
{
background(255);
smooth();
size(300,300);
noStroke();
frameRate(120);
colorMode(HSB);
}
void draw()
{
translate(width/2, height/2);
float b = noise(v) * 10.0;
float n = next;
fill(frameCount%180,255,255,50);
ellipse (next*cos(n)+b,next*sin(n)+b, 5*b, 5*b);
v=v+inc;
next = next+0.1;
}
Gauss’sche Verteilung
Denken wir an die Größenverteilung bei Menschen. Ein durchschnittlicher männlicher Österreicher ist 1,78 m groß. Betrachten wir nun eine Menge von Menschen, dann ist klar, dass sehr wenige über 2 m groß, oder kleiner als 1,65 sind. Die meisten sind etwa so groß, wie der Durchschnitt. Das heißt: Je größer die Abweichung vom Mittel, desto weniger Menschen dieser Größe wird es geben. Eine entsprechende Kurve sieht dann so aus:
In Processing kann man solche Zahlenverteilungen mit der Random – Klasse erzeugen. Die Klasse kann folgendermaßen verwendet werden: Objekt erstellen:
Random gauss;
Dann Objekt initialisieren:
gauss = new Random();
Nun kann man mit der folgenden Codezeile die Zahlen erzeugen:
float num = (float) generator.nextGaussian();
Strings
Processing 2.0
Variablen des Datentyps String können Zeichenketten enthalten. Im Gegensatz zu char, int oder float handelt es sich beim String nicht um einen „primitiven“ Datentyp, sondern um ein Objekt (siehe Objekte und Klassen).
Während der Datentyp char ein Zeichen enthalten kann und dieses in Apostrophen ‚ ‚ gesetzt werden muss, enthält ein String in der Regel mehrere Zeichen und diese werden in normale Anführungszeichen “ “ gesetzt.
Beispiel:
String A ="Hallo Welt!"; println(A);
Gibt „Hallo Welt“ im Terminalfenster aus.
Der Datentyp String bringt viele Methoden mit. Mit ihnen können die Daten im Objekt manipuliert werden.
Methoden von String:
- String.length(); //gibt die Anzahl der Zeichen zurück.
Beispiel:
String A ="Hallo Welt!"; println(A.length());
Gibt 12 im Terminalfenster aus. Beachte die runde Klammer nach length(). Sie ist hier unbedingt nötig, da es sich im Unterschied zum Array.length hier um eine Methode handelt.
- String.startsWith(); //gibt je nach Übereinstimmung true oder false zurück
String.endsWith(); //gibt je nach Übereinstimmung true oder false zurück
Beispiel:
String A ="Hallo Welt!";
println(A.startsWith("Hallo"));
println(A.endsWith("Hallo"));
println(A.endsWith("Welt!"));
Dieses Beispiel gibt true, false, true zurück, da die jeweiligen Zeichenketten mit dem Beginn oder dem Ende des Strings A übereinstimmen, oder auch nicht.
- String.charAt(); //gibt das Zeichen an der in Klammer angegebenen Position zurück (beginnt nat. mit 0)
Beispiel:
String A ="Hallo Welt!"; println(A.charAt(6));
Gibt ein ‚W‘ im Terminalfenster aus.
String.toLowerCase(); //wandelt den String in Kleinbuchstaben um String.toUpperCase(); //wandelt den String in Großbuchstaben um
Beispiel:
String A ="Hallo Welt!"; println(A.toLowerCase()); println(A.toUpperCase());
Gibt hallo welt und HALLO WELT im Terminalfenster aus.
- String.substring(); // gibt den String ab der in Klammer angegebenen Stelle, oder zwischen diesen Stellen zurück
Beispiel:
String A ="Hallo Welt!"; println(A.substring(4)); println(A.substring(3,8));
Gibt „o Welt!“ und „lo We“ zurück!
- String.equals(); // vergleicht 2 Strings und gibt true oder false zurück!
Da Strings keine primitiven Datentypen sind, können sie nicht mit == verglichen werden.
- String.toCharArray(); // legt die Zeichen des Strings in einem Array ab.
Beispiel:
String A ="Hallo Welt!"; char [] c = A.toCharArray(); println(c[0]); println(c[6]);
Gibt H und W im Terminalfenster aus.
Winkel und Wellen
Processing 2.0
Für die Erstellung von Grafiken sind Sinus-Kurven und Spiralen von essentieller Bedeutung. Mit Processing sind diese Formen sehr einfach umzustzen.
Zuerst aber etwas Mathematik. Winkel können in Grad ° und in Rad angegeben werden, wobei eine volle Umdrehung 360° oder 2 π (PI) Rad entspricht. π ist also 3,14. In Processing gibt es dafür die Konstanten PI, QUARTER_PI, HALF_PI und TWO_PI.
Zum Umrechnen dienen die Funktionen radians() – rechnet Grad in Rad, oder degrees() – rechnet Rad in Grad um.
sin und cos
Immer wenn in Processing ein Winkel anzugeben ist, wird dieser vom Programm in Rad erwartet. Wenn man lieber in Grad arbeitet, muss man ihn eben umrechnen (mit radians()).
Beispiel: Sinus starte Applet
size (300,300);
noStroke();
float winkel = 0.0;
for (int x=0; x<= width; x+=1) { //die Schleife ist notwendig, um alle x-Werte zu zeichnen.
fill(0);
float y= 150 + (-sin(radians(winkel))*50.0);//berechnet die y-Werte für eine Sin-Kurve
rect(x,y,1,1);
fill(160);
y= 150 + (-cos(radians(winkel))*20.0);//berechnet die y-Werte für eine Cos-Kurve
rect(x,y,1,1);
winkel += 1; //definiert die Skalierung der Wellen
}
Mit der Sinus- und Cosinus-Funktion kann man auch Kreise und Spiralen aus Objekten generieren.
Beispiel: Kreis starte Applet
noStroke();
size(300,300);
int radius =120;
for (int grad =0; grad<360; grad +=12) {
float winkel = radians(grad);
float x = 150 + (cos(winkel)*radius);
float y =150 + (sin(winkel)*radius);
ellipse(x,y,15,15);
}
Beispiel Spirale: starte Applet
noStroke();
size(300,300);
int radius =10;
for (int grad =0; grad<3600; grad +=12) {
float winkel = radians(grad);
float x = 150 + (cos(winkel)*radius);
float y =150 + (sin(winkel)*radius);
ellipse(x,y,15,15);
radius += 2;
}
Hier wird einfach für jeden Winkel der Radius erhöht. Das bewirkt, dass aus dem Kreis eine Spirale wird.
Aufgabe: Ändere das Programm so um, dass es eine schöne Spirale zeichnet.
Beispiel Vieleck: starte Applet
int ecken = 5; //Anzahl der Ecken!
int winkel;// wird später aus der Anzahl der Ecken berechnet
float x1, y1, x2, y2;
void setup() {
size(300, 300);
}
void draw() {
//die 2 folgenden Anweisungen lassen die Objekte nach kurzer Zeit verblassen
fill(255, 20);
rect(0, 0, width, height);
//Aufruf der Funktion mit den Parametern:
//Eckenzahl, MauspositionX, MauspositionY, RadiusX, RadiusY
vieleck(ecken, mouseX, mouseY, 80, 80);
}
// Funktion zeichnet Vielecke
void vieleck (int seiten, int x, int y, int radiusX, int radiusY) {
// winkel entspricht dem Abstander der Ecken in Grad
// z.B.: 3 Ecken:120°; 4 Ecken:90° usw.
winkel = (int) 360/seiten;
//die Schleife wird der Anzahl der Ecken entsprechend aufgerufen
//z.B.: 3 mal beim 3-Eck oder 4 mal beim 4_eck
for (int grade=0; grade<360; grade+=winkel) {
// erster Punkt
x1 =sin(radians(grade))*radiusX+(x);
y1 =cos(radians(grade))*radiusY+(y);
// zweiter Punkt
x2 =sin(radians(grade+winkel))*radiusX+(x);
y2 =cos(radians(grade+winkel))*radiusY+(y);
//zeichnet Linie zwischen Punkt 1 und Punkt 2
line(x1, y1, x2, y2);
}
}
In diesem Beispiel wird eine Funktion verwendet, um ein Vieleck mit beliebig vielen Punkten um die Mausposition am Bildschirm zu zeichnen. Dies wird erreicht, indem man den vollen 360°-Winkel durch die Anzahl der Eckpunkte des Vieleckes teilt.
z.B.: 3 Eckpunkte: 360/3 = 120°
Danach beginnen wir in einer Schleife bei Null° und addieren jeweils den Winkel, der bei der vorherigen Division herausgekommen ist. Bei 360° angekommen brechen wir die Schleife ab.
bei 3 Eckpunkten gibt die Schleife nach der Reihe die Winkel 0,120,240 aus.
Wir berechnen dann aus dem Sinus und dem Cosinus der 3 Winkel die Koordinaten der 3 Punkte des Dreiecks.
Der erste Punkt kommt unter der aktuellen Mausposition zu liegen, da wir die X-Achse mit dem Sinus und die Y-Achse mit dem Cosinus berechnen. Bei Null° bleibt also der X-Wert gleich, da der Sin von 0 ebenfalls 0 ist. Der Cos von 0 ist aber 1 und somit verschiebt sich der erste Punkt in pos. Y-Richtung nach unten. Dann werden die weiteren 2 Punkte nach dem gleichen Schema berechnet.
Um dann noch aus den einzelnen Punkten eine Form zu bekommen, brauchen wir in jedem Schleifendurchlauf noch einen weiteren Punkt, der entweder dem aktuellen um den Winkel voraus- oder nacheilt.


































