28. November 2012
Nach einem längeren Unterbruch haben wir jetzt wieder regelmässig ein Mal in der Woche für einen Halbtag Programming Basics. Zur Auffrischung haben wir ein Codestück namens "Force Field" angeschaut, bei welchem wir das Endergebnis verändern sollen. Programmiertechnisch wurden einige objektorientierte Basics repetiert und die ArrayList als nützliches Utility eingeführt. Fachlich war das natürlich sehr simpel für mich, aber ich habe mich darauf konzentriert, das Endergebnis zu beeinflussen und grafisch spannend zu gestalten. Ausgangslage Das Sourcestück "Force Field" bietet die Möglichkeit, mit der Maus ein Raster aus Linien zu beeinflussen, anzuziehen und die Linien zu verlängern. Beim Loslassen des Mausknopfes springen die Linien wieder in die Ursprungsform zurück. Grasbüschel Ich habe das Prinzip vom Anziehen umgekehrt und die Parameter, Farben und Optik so verändert, das die Linien nicht schrumpfen beim Loslassen, sondern selbstständig weiterwachsen. Dadurch kann man quasi Grasbüschel auf einer Wiese pflanzen und diese wachsen selbstständig weiter.ArrayList<ForcePoint> forcePointList = new ArrayList<ForcePoint>(); int borderDist = 10; int gridX = 70; int gridY = 70; void setup() { size(600,600); // setup the grid float stepX = (float)(width - borderDist * 2) / (gridX - 1); float stepY = (float)(height - borderDist * 2) / (gridY - 1); for(int x=0;x < gridX;x++) { for(int y=0;y < gridY;y++) { forcePointList.add(new ForcePoint((int)(stepX * x + borderDist),(int)(stepY * y + borderDist),1.01f, color(random(50,120),random(100,150),random(0,30)))); } } } void draw() { background(91,100,34); ForcePoint forcePoint; for(int i=0;i < forcePointList.size();i++) { forcePoint = forcePointList.get(i); forcePoint.update(); forcePoint.draw(); } } void mouseDragged() { ForcePoint forcePoint; for(int i=0;i < forcePointList.size();i++) { forcePoint = forcePointList.get(i); forcePoint.setInput(mouseX,mouseY); } }Klasse ForcePoint
  class ForcePoint { int posX; int posY; PVector dir; float damperValue; float maxDist = 150; color strokeColor = 0; float pointRotation = 0.0; ForcePoint(int x,int y,float damperValue, color strokeColor) { posX = x; posY = y; dir = new PVector(0,0); this.damperValue = damperValue; this.strokeColor = strokeColor; this.pointRotation = 60 - random(0,120); } void setInput(int mouseX,int mouseY) { PVector mouseDist = new PVector(mouseX - posX,mouseY - posY); if(mouseDist.mag() < random(10,100)) { mouseDist.normalize(); mouseDist.mult(-1); dir.add(PVector.mult(mouseDist,1.0)); // check for max length if(dir.mag() > maxDist) { dir.normalize(); dir = PVector.mult(dir,maxDist); } } } void update() { if(dir.mag() < maxDist) { dir.mult(damperValue); } } void draw() { stroke(strokeColor); strokeWeight(2); pushMatrix(); translate(posX,posY); rotate(radians(pointRotation)); translate(-posX,-posY); // if(dir.mag() > 0) { line(posX,posY,dir.x + posX,dir.y + posY); //} popMatrix(); } }