Toolbox Interactiondesign


Strukturen Verläufe

Verlaeufe // Muster

Lena Hellmann, 15.08.2013 | Generative Gestaltung Goes Analog bei Prof. Dr. Christine Goutrié

Der Verlauf ergibt sich aus einer sich lösenden Ansammlung von Linien und der Abnahme ihrer Farbintensität bzw. Tiefe im gefrästen Material.

Experiment

Am meisten interessierte mich der analoge Verlauf, geschaffen durch Tiefe der Fräsungen, dem ich mich anhand mehrerer Experimente angenähert habe. Zudem versuchte ich mich an mehreren Programmierungen, in denen die Zunahme von Linien oder anderen Figuren einen Verlauf bildeten. Letztendlich ist der finale Verlauf eine Kombination der beiden Verlaufsvarianten.

 

Programmcode

Der Code besteht lediglich aus der Programmierung einer Linie, die mit einer Vorschleife immer wieder mit zunehmenden Abstand aufgerufen wird. Durch den Einsatz eines Zufallswertes, erzeugt durch random(), lassen sich Anfang und Ende der Linien in einem bestimmten Bereich zufällig setzen. Jede Linie wirkt individuell. Zusätzlich wird in die Klammer zur Ermittlung der Linienfarbe die „for-schleifen-Variable“ i eingesetzt. Diese bestimmt den Wachstum des Wertes in x-Richtung. Die Position x in stroke() bestimmt nun auf der Bühne von 0 bis 255 (schwarz bis weiß) den Farbwert.

/* Verlauf
   _Abstand der Linien wächst
   _Farbe der Linien nimmt nach rechts ab
   _Linien Anfang und Ende werden in einem Werteraum von 20 
    zufällig angeordnet
   _durch diese Zufälligkeit sieht jedes png anders aus
*/

PrintWriter output; 

int i;

void setup() { 
  
  background(255);  
  size(300, 300);
  noFill();  
  output = createWriter("VerlaufLinienRandom.ngc"); 
  output.println("%");
  output.println("G 54");
  
}

void draw(){
  for(float i = 40; i < 260; i *= 1.05){
    stroke(i*1.05);  
    strokeWeight(2);    
    //Farbe der Linien durch Position bestimmt
    line(i + random(-10,10), 40, i + random(-10,10), 260);
    output.println("G0 X"+(i+random(-10,10))+" Y"+20);
    output.println("G1 Z"+(map(i*1.8, 0, 255, -0.8, 0))+"F300");
    output.println("G1 X"+(i+random(-10,10))+" Y"+70);
    output.println("G0 Z1.5");
  }
  noLoop();
}

void mousePressed() {
  saveFrame("VerlaufLinienRandom.png");
  output.println("M 02");
  output.println("%");
  output.flush(); 
  output.close(); 
  exit();
}

Muster

Der Diamant ist ein Bild, entstanden aus zwei simplen Programmierungen, die durch Bedingungen versetzt auf der Bühne angeordnet werden. Durch Austauschen der Tiefe über G1 lassen sich Fräsungen in Holz, Pappe oder anderen Materialien vornehmen, auch superfeine Zeichnungen sind möglich.

Die Faszination mit der superfeinen Linie inspirierte mich, das oben gezeigte Muster, die „Bergspitzen“, in zwei Varianten zu entwerfen und zu programmieren.

Der Stern entstand aus einer Rasterzelle, die gedreht drei weitere Male eingesetzt wurde.

 

3D Muster

Das erste dreidimensionale Muster ergab sich aus der Aufbauphase der Sterne. Die am Bildschirm stark  dreidimensional wirkenden Muster waren auf dem analogen Produkt nur geringfügig dreidimensional zu erkennen. Nur durch einen bestimmten Blickwinkel war das 3D Muster geschaffen. Dies motivierte mich, weitere Phänomene der dreidimensionalen Wirkung durchzuspielen.

Die dreidimensional wirkenden Muster sind Teil der Experimentierphase zum Projekt „line opens space in surfaces“. Je nach Blickwinkel und vorliegenden Kontrast zwischen Linie und Hintergrund zeigten sich dreidimensionale Ebenen auf. Es entstanden Räume, Würfel aber auch Tiefen.

Die meisten Muster wirken aufgrund der stärkeren Leuchtkraft der Linien am Bildschirm intensiver.

Programmcode – Diamant

Der folgende Sketch besteht lediglich aus acht Parametern, die Erklärung dazu ist rechts zu finden. Über die Parameter können Größe und Proportionen der Diamanten verändert werden. Lädt man den Code, so wie er hier vorliegt, in Processing, speichert sich automatisch ein ngc-Code für die Fräse und durch Mausklick die dazugehörige Bilddatei ab.

Importiert man den G – Code, der mit Hilfe des Programms abgespeichert wird, und aktiviert die Fräse, erhält man durch das Einspannen eines Stiftes eine DIN A5 große Diamanten-Zeichnung.

/* Diamant_Muster
   _Konstruierung der beiden verwendeten Rasterzelle 
   _die beiden Rasterzellen füllen angeordnet über Bedingungen das Raster aus
*/


PrintWriter output;
void setup() {
  background(255);
  stroke(0);
  size((rasterB*3+2*rand), (rasterH*3+2*rand));
  output = createWriter("Diamanten_Muster.ngc");
  output.println("%");
  output.println("G 54");
}
int rand= 10;             //Rand nach außen
int rasterH= 40;          //Rasterzellenhoehe
int rasterB= 30;          //Rasterzellenbreite
int abstLG= 5;            //Abstand der Linien / gross
int abstLK= 2;            //Abstand der Linien / klein
int breiteL= 12;          //Abstand der Linien vom Rand rechts
int Y= 18;                //Abstand der Linien vom Rand links
int X= 25;                //Abstand der Linien vom Hoehe


//Diamanten Konstruktion über Vorschreifen und Bedingungen

void draw() {
  
  //definiert Breite einer Rasterzelle
  for (int i = 0; i< width-(rand+rasterB); i+= rasterB) {  
    //definiert Hoehe einer Rasterzelle    
    for (int j = 0; j< height-(rand+rasterH); j+= rasterH) { 
      //definiert die Anzahl der Linien im kleinen Abstand      
      for (int k = 0; k<= rasterB; k+=abstLG) {                        
          if(i%(2*rasterB)==0 && j%(2*rasterH)==0) {
          line(i+k+rand, j+rand, i+rand, j+rasterH+rand);
          output.println("G0 X"+(i+k+rand)+" Y"+(j+rand));
          output.println("G1 Z"+(0)+"F300");
          output.println("G1 X"+(i+rand)+" Y"+(j+rasterH+rand));
          output.println("G0 Z1.5");
          }
          if(i%(2*rasterB)==rasterB && j%(2*rasterH)==rasterH) {
          line(i+k+rand, j+rand, i+rand, j+rasterH+rand);
          output.println("G0 X"+(i+k+rand)+" Y"+(j+rand));
          output.println("G1 Z"+(0)+"F300");
          output.println("G1 X"+(i+rand)+" Y"+(j+rasterH+rand));
          output.println("G0 Z1.5");
          }
          if(i%(2*rasterB)==0 && j%(2*rasterH)==rasterH) {
          line(i+k+rand, j+rand, i+rand+rasterB, j+rasterH+rand);
          output.println("G0 X"+(i+k+rand)+" Y"+(j+rand));
          output.println("G1 Z"+(0)+"F300");
          output.println("G1 X"+(i+rand+rasterB)+" Y"+(j+rasterH+rand));
          output.println("G0 Z1.5");
          }
          if(i%(2*rasterB)==rasterB && j%(2*rasterH)==0) {
          line(i+k+rand, j+rand, i+rand+rasterB, j+rasterH+rand);
          output.println("G0 X"+(i+k+rand)+" Y"+(j+rand));
          output.println("G1 Z"+(0)+"F300");
          output.println("G1 X"+(i+rand+rasterB)+" Y"+(j+rasterH+rand));
          output.println("G0 Z1.5");
          }
      }
      
      //definiert die Anzahl der Linien im großen Abstand
      for (int l = 0; l<= breiteL; l+=abstLK) {                        
        if(i%(2*rasterB)==0 && j%(2*rasterH)==0) {
          line(i+l*2.5+rand, j+rasterH+rand, i+Y+l+rand, j+X+rand);
          output.println("G0 X"+(i+l*2.5+rand)+" Y"+(j+rasterH+rand));
          output.println("G1 Z"+(0)+"F300");
          output.println("G1 X"+(i+Y+l+rand)+" Y"+(j+X+rand));
          output.println("G0 Z1.5");
          }
          if(i%(2*rasterB)==rasterB && j%(2*rasterH)==rasterH) {
          line(i+l*2.5+rand, j+rasterH+rand, i+Y+l+rand, j+X+rand);
          output.println("G0 X"+(i+l*2.5+rand)+" Y"+(j+rasterH+rand));
          output.println("G1 Z"+(0)+"F300");
          output.println("G1 X"+(i+Y+l+rand)+" Y"+(j+X+rand));
          output.println("G0 Z1.5");
          }
          if(i%(2*rasterB)==0 && j%(2*rasterH)==rasterH) {
          line(i+l*2.5+rand, j+rasterH+rand, i+l+rand, j+X+rand);
          output.println("G0 X"+(i+l*2.5+rand)+" Y"+(j+rasterH+rand));
          output.println("G1 Z"+(0)+"F300");
          output.println("G1 X"+(i+l+rand)+" Y"+(j+X+rand));
          output.println("G0 Z1.5");
          }
          if(i%(2*rasterB)==rasterB && j%(2*rasterH)==0) {
          line(i+l*2.5+rand, j+rasterH+rand, i+l+rand, j+X+rand);
          output.println("G0 X"+(i+l*2.5+rand)+" Y"+(j+rasterH+rand));
          output.println("G1 Z"+(0)+"F300");
          output.println("G1 X"+(i+l+rand)+" Y"+(j+X+rand));
          output.println("G0 Z1.5");
          }
      }
    }
  }
  noLoop();
}

//ueber Mausklick im .png Format gespeicherte Bilddatei

void mousePressed() {                                         
  saveFrame("Diamanten_Muster.png");
  output.println("M 02");
  output.println("%");
  output.flush();
  output.close();
  exit();
  
}
31.08.2013 | Lena Hellmann |