Die Variable rubberbandMaxLength definiert die maximale Länge, die ein neu gespanntes Gummiband haben darf (Zeile 7), distance() berechnet den Abstand zwischen zwei Partikeln (Zeile 15). findNearest() liefert das nächstgelegene Partikel, sofern vorhanden, sonst null (Zeile 20). connect() verbindet zwei Partikel (Zeile 33).
Diese neuen Funktionen greifen in einer erweiterten Version von addParticle() (Zeile 39) ineinander: Wurde innerhalb der Distanz rubberbandMaxLength ein Nachbar gefunden, verbindet das Programm ihn mit dem aktuellen Partikel.
Listing 7
//Partikel03/ParticleSystem.pde
class ParticleSystem {
// Behaelter fuer die Partikel
ArrayList<Particle> particles;
// max. Laenge neuer Partikelverbindungen
float rubberbandMaxLength = 100;
ParticleSystem() {
// Partikelbehaelter initialisieren
particles = new ArrayList<Particle>();
}
// Entfernung zwischen zwei Partikeln
float distance(Particle p1, Particle p2) {
return p1.pos.dist(p2.pos);
}
// Partikel mit der geringsten Entfernung zu p1
Particle findNearest(Particle p1) {
float minDistance = 1000000;
Particle result = null;
for (Particle p2 : particles) {
if (distance(p1, p2) < minDistance && p1 != p2) {
minDistance = distance(p1, p2);
result = p2;
}
}
return result;
}
// Gummiband zwischen zwei Partikeln spannen
void connect(Particle p1, Particle p2) {
p1.connectedParticles.add(p2);
p2.connectedParticles.add(p1);
}
// Partikel hinzufuegen und ggf. per Gummiband verbinden
void addParticle() {
Particle newParticle = new Particle();
Particle nearest = findNearest(newParticle);
if (nearest != null &&
distance(newParticle, nearest) < rubberbandMaxLength) {
connect(newParticle, nearest);
}
particles.add(newParticle);
}
// Geschwindigkeit/Position aller Partikel aktualisieren
void update() {
for (Particle circle : particles) {
circle.update();
}
}
// alle Partikel darstellen
void display() {
for (Particle circle : particles) {
circle.display();
}
}
}
Fazit und Ausblick
Wie unser Beispielprojekt zeigt, lassen sich in Processing mit wenig Code schicke, interaktive Anwendungen entwickeln, samt der zugehörigen Physik. Die Programmiersprache hat aber noch mehr auf dem Kasten: Es lohnt sich ein Blick in Datei | Beispiele. Viele externe Processing-Libraries laufen auch auf dem Raspberry Pi. Diese finden Sie unter Sketch | Library hinzufügen. Besonders interessant sind hier GL Video für hardwarebeschleunigte Videowiedergabe und Hardware I/O für die Arbeit mit den GPIO-Pins. Mit den beiden beschäftigen wir uns in einem Artikel in der nächsten Ausgabe.





