20. September 2012
Am zweiten Tag des Kurses haben wir mit Programmieren losgelegt. Um gleich einige grafische Ergebnisse zu erhalten, arbeiten wir mit Processing, einer Opensource Library für Java. Processing liefert auch gleich eine kleine Entwicklungsumgebung mit, mit der simpel und einfach kleine Projekte entworfen werden können. Da ich mit den Grundlagen des Programmierhandwerks schon vertraut war, habe ich mich aufgemacht, Processing etwas zu erkunden und mit verschiedenen Funktionen experimentiert. Die grafische Programmierung oder die Arbeit im dreidimensionalen Raum ist mir noch ziemlich unbekannt und ich habe erste kleine Gehversuche darin gewagt. Ich habe gleich mal etwas Dreidimensionales versucht und nachdem am Anfang recht lange gar nichts geschah, erschien dann plözlich das erste Würfelchen auf dem Screen. Inspiriert vom Loading-Screen von Processing habe ich experimentiert mit einer Art Netz aus Kugeln, welche durch Linien verbunden sind. Dabei können die Kugeln alle in einer Reihenfolge verbunden sein oder alle Kugeln mit Allen. Zur Darstellung der Dreidimensionalität dreht sich das Ganze. Mir gefällt das Aussehen solcher Netze und ich möchte später mal ein richtiges Projekt entwerfen, welches mit der grafischen Darstellung und Bearbeitung eines Netzwerks zu tun hat.Ergebnis:
Code:
private float ang = 0.0; private float sphereAng = 0.0; private static final int SPHERE_COUNT = 20; private static final int CLOUD_RADIUS = 200; private static final int LINE_STRENGTH = 1; private static final int CONNECT_LAST = 1; private static final int CONNECT_ALL = 2; private int sphere_size = 10; private ArrayList<Sphere> spheres = new ArrayList<Sphere>(); public void setup() { size(600, 600, P3D); background(0); noStroke(); //Ein paar Kugeln initialisieren und speichern for(int i=0; i < SPHERE_COUNT; i++) { Sphere sphere = new Sphere(sphere_size,(int)random(-CLOUD_RADIUS,CLOUD_RADIUS),(int)random(-CLOUD_RADIUS,CLOUD_RADIUS),(int)random(-CLOUD_RADIUS,CLOUD_RADIUS)); spheres.add(sphere); } } public void draw(){ background(0); fill(255,255,255); //Beleuchtung pointLight(255, 255,255, 50,50, 300); ambientLight(70, 70, 70); translate(width * 0.5, height * 0.5, 0); rotateY(radians(ang)); rotateX(radians(ang)); ang += 0.2; if(mousePressed) { for (Sphere sphere : spheres){ if(sphere.r < 40) { sphere.r += 1; } } } drawSphereNet(CONNECT_ALL); } //Zeichnet das Kugelnetz public void drawSphereNet(int connectionMode) { Sphere lastSphere = null; for (Sphere sphere : spheres){ pushMatrix(); translate(sphere.getPositionX(),sphere.getPositionY(),sphere.getPositionZ()); sphere.drawSphere(); popMatrix(); if(connectionMode == CONNECT_ALL) { //Alle Kugeln verbinden for(Sphere otherSphere : spheres) { connectSpheres(sphere,otherSphere); } } else if(connectionMode == CONNECT_LAST) { //Immer die Letzte mit der nächsten Kugel verbinden if(lastSphere != null) { connectSpheres(sphere,lastSphere); } lastSphere = sphere; } } } //Verbindet eine Kugel mit der Zweiten public void connectSpheres(Sphere sphere1, Sphere sphere2) { stroke(255); strokeWeight(LINE_STRENGTH); line(sphere1.getPositionX(),sphere1.getPositionY(),sphere1.getPositionZ(),sphere2.getPositionX(),sphere2.getPositionY(),sphere2.getPositionZ()); noStroke(); } //Setzt die Kugelgrösse auf den Ursprungszustand public void mouseReleased() { for (Sphere sphere : spheres){ sphere.r = 10; } }
Kugel-Klasse
public class Sphere { // Properties private int r; private int posX, posY, posZ; // Constructor public Sphere(int r, int posX, int posY, int posZ){ this.r = r; this.posX = posX; this.posY = posY; this.posZ = posZ; } public void drawSphere(){ sphere(r); } public int getPositionX() { return posX; } public int getPositionY() { return posY; } public int getPositionZ() { return posZ; } }