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.

pushMatrix, pushStyle und Trigonometrie

23. September 2013

Ziel war es das vorgefertigte Template eines - der Maus entsprechend rotierend und skalierendes - Smileys so zu verändern, dass es von seinem Ebenbild fortlaufen umkreist wird. Erst mal musst ich aus dem bestehenden Template schlau werden, was mir aber nur teilweise gelang. Was es mit dem "pushMatrix" auf sich hatte verstand ich ziemlich schnell, sie erlauben eine zeitweilige Neudefinition des Koordinatensystems bis zum Befehl "popMatrix". Die trigonometrischen Funktionen blieben mir weitgehend schleierhaft doch immerhin verstand ich, dass ich dies zum Lösen der Aufgaben gar nicht zu wissen brauchte. Es reichte, die "pushMatrix" des statischen Smileys richtig in jener des Grossen Smileys zu verschachteln und seine "rotation()" von einer zunehmenden Variabel abhängig zu machen, um den gewünschten Effekt zu erzielen. Euphorisiert von den neuen Möglichkeiten verschachtelte ich weitere Smiley-Funktionen in die bestehenden und fügte einen Button zum Ändern der Richtung und Geschwindigkeit ein (Key '1' und '2'). Toll. Aus Neugier löschte ich dann den "background()" und gab den Smileys verschiedene halbtransparente Farben - nun wurden die Spuren der Objekte sichtbar.
float orbit;
float gesch;

void setup()
{

  size(800, 800);      // def. fenstergroesse

  smooth();           // aktiviere antialiasing
  strokeWeight(15);    // linienbreite

}

void draw()
{
   // background(255,255,255,1);    // def. hintergrundfarbe

  float radius = dist(mouseX, mouseY, width/2, height/2);  // rechne die distanz vom mousecursor zum fensterzentrum aus
  radius = map(radius, 0, width, 1, 4);                     // rechne aus in welchem bereich der radius am schluss sein sollte
  orbit = orbit+gesch; 

  pushMatrix();
  translate(width/2, height/2);
  rotate(calcAngle());
  scale(radius);
  pushStyle();
  stroke(0,0,255,50);
  smiley();          // funtions aufruf
popStyle();

  rotate(orbit);
  pushMatrix();
  translate(100, 100);
  rotate(0);
  scale(radius/2);
   pushStyle();
  stroke(200,200,0,50);
  smiley();  
  popStyle();
  
  rotate(orbit);
  pushMatrix();
  translate(100, 100);
  rotate(0);
  scale(radius/4);
   pushStyle();
  stroke(255,0,0,50);
  smiley(); 
  rotate(orbit);
  pushMatrix();
  translate(100, 100);
  rotate(0);
  scale(radius/6);
   pushStyle();
  stroke(0,255,0,255);
  smiley();          // funtions aufruf
  popStyle();
  popMatrix();
  popMatrix();

  popMatrix();
  popMatrix();
}

void keyPressed()
{
  switch(key)
  {
  case '1':
    gesch = gesch+0.01;
    break;
  case '2':
  gesch = gesch-0.01;
  break;
  }
}

// funktion
void smiley()
{
  noFill();
  ellipse(0, 0, 180, 180);  // kopf

  fill(0);
  ellipse(0 - 30, 0 - 30, 20, 20);  // linkes augen
  ellipse(0 + 30, 0 - 30, 20, 20);  // rechtes augen

  noFill();
  arc(0, 0, 100, 100, radians(20), radians(180-20));  // mund
}

// berechne den winkel zur fenstermitter vom mausecursor aus
// die winkel sind in radiant
float calcAngle()
{
  return -atan2(mouseX - (width / 2), mouseY - (height / 2));
}

Dizzy Smile Erkenntnis: Es lassen sich mit wenig Kenntnis schon viele interessante Dinge simulieren. Mit etwas mehr Kenntnis bestimmt auch relevantere Dinge als die "Wahrnehmung unter Drogeneinfluss", welche meine Smileys wiederzugeben scheinen.