16. November 2012
Aufgabe war es, den vorgegebenen Code der ForceFields (Ext. Lektion 3) zu verändern und eine eigene Version davon zu kreieren. Meine Idee dabei war es, anstatt Linien Zacken darzustellen, die vom Mauszeiger wegzeigen. Dies ergab einen spannenden 3D-Effekt: Es sieht aus als würde sich eine Kugel bewegen, die überall mit Zacken versehen ist. Video 1: ForceFields1 Per Zufall ist noch eine weitere Version davon entstanden, indem die Normalize-Funktion der Anfangspunte der Zacken weggelassen wurde. Video 2: ForceFields2 Code:ArrayList<ForcePoint> forcePointList = new ArrayList<ForcePoint>(); int borderDist = 30; int gridX = 40; int gridY = 40; 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),100,0.99f)); } } } void draw() { background(0); 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); } }
class ForcePoint { int posX; int posY; float radius; PVector dir; // PVector dir2; float damperValue; float maxDist = 50; ForcePoint(int x,int y,float radius,float damperValue) { posX = x; posY = y; dir = new PVector(0,0); this.radius = radius; this.damperValue = damperValue; } void setInput(int mouseX,int mouseY) { PVector mouseDist = new PVector(mouseX - posX,mouseY - posY); if(mouseDist.mag() < radius) { mouseDist.normalize(); dir.add(PVector.mult(mouseDist,1)); // dir2.add(PVector.mult(mouseDist,1)); // check for max length if(dir.mag() > maxDist) { dir.normalize(); dir = PVector.mult(dir,maxDist); } } } void update() { dir.mult(damperValue); } void draw() { stroke(255); //point(posX,posY); PVector baseDist = dir.cross(new PVector(0,0,5)); // baseDist.normalize(); // baseDist.mult(3); //Breite der Zacken // PVector.mult(baseDist,1); line(posX-baseDist.x,posY-baseDist.y,-dir.x + posX,-dir.y + posY); line(posX+baseDist.x,posY+baseDist.y,-dir.x + posX,-dir.y + posY); stroke(255); } }