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.

11.1 Permutation

25. November 2010

Im Zeichenmodul haben wir verschiedene Permutationen mit Zeichen erstellt, die wir nun mit dieser Aufgabe angefangen haben mit Processing zu verbinden. Basierend auf einem Ausgangsscript, das einfache Zeichenfunktionen verwendet und die Anordnung der Elemente bereitstellt, durften wir eine eigene Permutation übernehmen.

Nachbau eigener Permutation

Um besser Varianten der Permutation zu erstellen, habe ich den Code so geändert, dass das Zeichnen eines einzelnen Objektes von einer Funktion übernommen wird. Mit den Parametern dieser Funktion kann ich dann das Aussehen steuern. Diese drawSign-Funktion wird von drawPermutationObj() aufgerufen, welche die Startwerte und Increments definiert (Vergrösserung, Verkleinerung, Verschiebung). Ich sage hier also, dass der weisse kleine Kreis in der Mitte am Anfang der Transformation z.B. die Grösse 12px hat und sich von Transformationsschritt zu Transformationsschritt um 3px vergrössert. Beim "Trabanten", der sich optisch um das zentrale Element dreht kann ich zudem noch die Verschiebung in der Y-Achse definieren.

Zeichen mit Skalierung

Zusatzaufgabe: Für die Funktion drawPermutationObj() müssen wir noch einen weiteren Parameter einführen (Float), welcher das Objekt auf irgendeine Art verändert, z.B. Skalierung. Schlussendlich werden wir unsere drawPermutationObj-Funktion untereinander austauschen und diese animieren. Programm Code
int     anzahl = 7;
int     rand = 75;
float   xStep;
float   yStep;
int[]   permutationsIndexList = {0, 1, 2, 3, 4, 5, 6,
                                 1, 2, 3, 4, 5, 6, 5,
                                 2, 3, 4, 5, 6, 5, 4,
                                 3, 4, 5, 6, 5, 4, 3,
                                 4, 5, 6, 5, 4, 3, 2,
                                 5, 6, 5, 4, 3, 2, 1,
                                 6, 5, 4, 3, 2, 1, 0};

void setup()
{
  size(760, 760);
  smooth();

  xStep = (width - 2 * rand) / (float)(anzahl-1);
  yStep = (height - 2 * rand) / (float)(anzahl-1);

  noLoop();
}

void draw()
{
  background(255);

  int     permutationsIndex = 0;

  pushMatrix();
    translate(rand,rand);
    for(int y=0; y<anzahl;y++)
    {
      pushMatrix();
        for(int x=0; x<anzahl;x++)
        {
          drawPermutationObj(permutationsIndexList[permutationsIndex], permutationsIndex);
          print(str(permutationsIndexList[permutationsIndex]) + "\t");

          ++permutationsIndex;

          translate(xStep,0.0f);
        }
        println();
      popMatrix();
      translate(0.0f,yStep);
    }
  popMatrix();

}

void drawSign(int b1, int w1, int b2, int w2, int tb1, int tw1, int tb2, int rot, int sb2, int sw2, int stb1, int stw1, int stb2, float scaling)
{
  pushMatrix();
  scale(scaling);
  rotate(radians(rot));
  pushStyle();
    fill(0);
    noStroke();
    ellipse(0,0,b1,b1); // black circle 1
    ellipse(0,stb1,tb1,tb1); // trabant black circle
    fill(255);
    ellipse(0,0,w1,w1); // white circle 1
    fill(0);
    ellipse(0,sb2,b2,b2); // inner black circle
    fill(255);
    ellipse(0,stw1,tw1,tw1); // trabant white circle
    ellipse(0,sw2,w2,w2); // inner white spot
    fill(0);
    ellipse(0,stb2,tb2,tb2); // trabant black inner circle
  popStyle();
  popMatrix();
}

void drawPermutationObj(int type, int index)
{
  // central element
  int startB1 = 75; // B1: big black circle
  float incB1 = 0;
  int startW1 = 64; // W1: big white circle
  float incW1 = 0;

  int startB2 = 42; // B2: smaller black circle
  float incB2 = -1.5;
  int startW2 = 8; // W2: smallest white circle
  float incW2 = 3.0;

  int startSb2 = 0; // Sb2: shift B2
  float incSb2 = 2.0;
  int startSw2 = 0; // Sw2: shift W2
  float incSw2 = 2.7;

  // trabant
  int startTb1 = 40; // Tb2: big black circle trabant
  float incTb1 = 1.0;
  int startTw1 = 29; // Tw2: big white circle trabant
  float incTw1 = 2.0;
  int startTb2 = 8; // Tb2: small black circle trabant
  float incTb2 = 4.0;

  int startStb1 = -36; // Stb1: shift Tb1
  float incStb1 = 2.8;
  int startStw1 = -36; // Stw1: shift Tw1
  float incStw1 = 3;
  int startStb2 = -36; // Stb2: shift Tb2
  float incStb2 = 4.0;

  // scaling sign
  float startScale = 0.8;
  float incScale = 0;

  drawSign(
      startB1+(int)(type*incB1),
      startW1+(int)(type*incW1),
      startB2+(int)(type*incB2),
      startW2+(int)(type*incW2),
      startTb1+(int)(type*incTb1),
      startTw1+(int)(type*incTw1),
      startTb2+(int)(type*incTb2),
      type*30,
      startSb2+(int)(type*incSb2),
      startSw2+(int)(type*incSw2),
      startStb1+(int)(type*incStb1),
      startStw1+(int)(type*incStw1),
      startStb2+(int)(type*incStb2),
      startScale+(float)(type*incScale));
}

void keyPressed()
{
  switch(key)
  {
  case ' ':
    save("permutation.jpg");
    break;
  }
}