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.

Ornamente – Zufällig generiertes Ornament

9. November 2010

Konzept Ich wollte ein Ornament in Processing erstellen welches sich von Rendering zu Rendering unterscheidet, allerdings in Y- und X- Richtung duplizierbar bleibt (Pattern). Die Grundidee war es horizontale und vertikale Linien zu Zeichnen die sich wiederrum in Segmente unterteilen... pro Segment wird ein zufälliger Wert für die Y-Achse bei Horizontalen Linien undein zufälliger Wert für die X-Achse bei Vertikalen Linien gewählt. So erhält man bei jedem neuen Rendering ein neues Ornament welches als Pattern kombinierbar mit den anderen bleibt:
/* 
* ORNAMENT
* 
* Predefined dockingPoints where the ornament starts and ends on the x-axe and
* y-axe to provide the functionality of reproducing this ornament itselfs on
* the y-axe and x-axe with a clear flow into each other
*
* @name ORNAMENT
* @author Sebastian Pape <sebastian.pape@zhdk.ch>
* @version 0.9
*/

import processing.pdf.*;

/*
* SEGMENTS
* 
* The spreaf of possible segments for each line
* 
*/
int segmentsMin = 2;
int segmentsMax = 8;

/*
* DOCKING POINTS
* 
* The docking poits array defines points where the ornament starts and end
* seperated in y-axe and x-axe
* 
*/
ArrayList dockingPointsXAxe = new ArrayList();

void fillDockingPointsXAxe() {
  dockingPointsXAxe.add(15);
  dockingPointsXAxe.add(50);
  dockingPointsXAxe.add(180);
  dockingPointsXAxe.add(250);
  dockingPointsXAxe.add(320);
  dockingPointsXAxe.add(460);
  dockingPointsXAxe.add(500);
  dockingPointsXAxe.add(560);
}

ArrayList dockingPointsYAxe = new ArrayList();

void fillDockingPointsYAxe() {
  dockingPointsYAxe.add(25);
  dockingPointsYAxe.add(60);
  dockingPointsYAxe.add(145);
  dockingPointsYAxe.add(222);
  dockingPointsYAxe.add(324);
  dockingPointsYAxe.add(445);
  dockingPointsYAxe.add(488);
  dockingPointsYAxe.add(571);
}

/*
* SETUP 
*/
void setup() {
  size(600,600,PDF,"ornament.pdf");      // def. fenstergroesse
  //size(600, 600);
  smooth();           // aktiviere antialiasing
  strokeWeight(10);    // linienbreite
  strokeJoin(BEVEL); 
  
  fillDockingPointsXAxe();
  fillDockingPointsYAxe();
  
  noLoop();
}

/*
* DRAW 
*/
void draw() {
  background(255);    // def. hintergrundfarbe
  
  drawLines();
  
  exit();
}

/*
* DRAW LINES
*/
void drawLines() {
  // horizontal lines
  for (int i = 0; i <= dockingPointsXAxe.size()-1; i++) {
    drawLine(0,((Integer)dockingPointsXAxe.get(i)).intValue());
  }
  // vertical lines
  for (int i = 0; i <= dockingPointsYAxe.size()-1; i++) {
    drawLine(((Integer)dockingPointsXAxe.get(i)).intValue(), 0);
  }
}

/* 
* DRWAW LINE
*/
void drawLine(int startPointX, int startPointY) {
  float segments = round(random(segmentsMin, segmentsMax));
  
  // first point to check if the current line is a horizontal or vertical line
  float firstX = startPointX;
  float firstY = startPointY;

  // last point for the for drawing lines during the for loop
  float lastX = firstX;
  float lastY = firstY;
  
  for(int i = 1; i <= segments; i++) {
    // set the current point
    float currentX = width / segments * i;
    float currentY = 100 + (height - 200) * random(1);
    
    if(i == segments) {
      // let the last drawn part ends where the line begins
      currentX = firstX;
      if(currentX == 0) {
        currentX = width;
      }
      currentY = firstY;
      if(currentY == 0) {
        currentY = height;
      }
    }
    
    // draw line
    line(lastX, lastY, currentX, currentY);
    
    // set last point
    lastX = currentX;
    lastY = currentY;
  }
}