Visualisierung von Translation, Rotation und wieder Translation

Aus DDSWiki
Wechseln zu: Navigation, Suche
  • Wir wollen ein Quadrat um 45 Grad drehen (um die eigene Achse bzw. auf der Stelle) und müssen dazu translatieren, rotieren und wieder translatieren.

Code zum selbst Ausprobieren

  • Anmerkung: Es muss immer eine beliebige Taste gedrückt werden zwischen den einzelnen Transformationen, um die Animation anzustoßen
Koordinatensystem ks = new Koordinatensystem();
int c = 0;

boolean makeTranslation = true;
void setup() {
  size(400, 400);
  translate(200/2, 200/2);
  ks.zeichne();
  background(120);
  frameRate(20);
}

int tx = 0;
int ty = 0;
int tx2 = 0;
int ty2 = 0;
int w = 0;
void draw() {

  switch (c) {
  case 0:
    rect(200/2, 200/2, 30, 30);
    break;
  case 1:
    background(120); 
    pushMatrix();
    translate(115,115);
    rotate(radians(45));
    translate(-115,-115);
    rect(200/2, 200/2, 30, 30);
    popMatrix();
    break;
  case 2:
    background(120);  
    rect(200/2, 200/2, 30, 30);
    break;
  case 3:
    background(120); 
    ks.zeichne();
    rect(200/2, 200/2, 30, 30);
    break;   
  case 4:
    if (tx<115 && makeTranslation) {
      background(120);  
      translate(tx++, ty++);
      ks.zeichne();
      translate(-tx++, -ty++);
      push();
      fill(255, 120);
      rect(200/2, 200/2, 30, 30);
      stroke(0, 0, 255);
      strokeWeight(2);
      circle(115, 115, 2);
      pop();
      fill(0);
      text("translatiere zum Mittelpunkt des Objektes", 100, 370);
      fill(255);
    } else {    
      tx=115; ty=115;
  }
    if (tx>=115) {   
      if (w<=45) {
        background(120); 
        pushMatrix();
        if (makeTranslation)
          translate(tx, ty);
        rotate(radians(w++));
        ks.zeichne();
        popMatrix();
        push();
        fill(255, 120);
        rect(200/2, 200/2, 30, 30);
        stroke(0, 0, 255);
        strokeWeight(2);
        circle(115, 115, 2);
        pop();
        fill(0);
        text("rotiere um 45 Grad", 100, 370);
        fill(255);
      }
    }
    if (w>=45 && tx2<=115 && makeTranslation) {
      background(120); 
      pushMatrix();
      if (makeTranslation)
        translate(tx, ty);
      rotate(radians(w));
      translate(-tx2++, -ty2++);
      ks.zeichne();
      popMatrix();
      push();
      fill(255, 120);
      rect(200/2, 200/2, 30, 30);
      stroke(0, 0, 255);
      strokeWeight(2);
      circle(115, 115, 2);
      pop();
      fill(0);
      text("translatiere das Koordinatensystem zurück", 100, 370);
      fill(255);
    }
    break;
  }
}

void keyPressed() {
  c = c +1;
  println(c);
}

class Koordinatensystem {
  int x = 0;
  int y = 0;
  int w = 200;
  int h = 200;

  void zeichne() {
    push();
    stroke(200, 100, 0);
    rect(x, y, w*2, h*2);
    for (int i=x; i<w*2; i=i+10) {
      line(i, y, i, h*2);
      line(x, i, w*2, i);
    }
    stroke(0, 255, 0);
    strokeWeight(2);
    circle(0, 0, 2);
    pop();
    fill(255,255,0,200);
    rect(x+w/2, y+h/2, 30, 30);
    fill(255);
  }
}