Willkommen auf unserem Seminar-Blog

Immer auf dem aktuellen Stand bleiben

Dieser Seminar-Blog befindet sich noch im Aufbau und wird in den kommenden Tagen entsprechend verfeinert.

Member Login

Lost your password?

Registration is closed

Sorry, you are not allowed to register by yourself on this site!

You must either be invited by one of our team member or request an invitation by email at viad.info {at} zhdk {dot} ch.

Lektion 11 – Gedeih und spriesse

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. Sourcecode

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();

}
}