Einblick in die generative Gestaltung mit «Processing»

Sechs Kursabende à vier Stunden an der EB Zürich

Kurskonzeption und Leitung Hanna Züllig


< back

						/*
Autorin: Nadja Kümin
based on:
/ P_2_2_4_01.pde
// 
// Generative Gestaltung, ISBN: 978-3-87439-759-9
// First Edition, Hermann Schmidt, Mainz, 2009
// Hartmut Bohnacker, Benedikt Gross, Julia Laub, Claudius Lazzeroni
// Copyright 2009 Hartmut Bohnacker, Benedikt Gross, Julia Laub, Claudius Lazzeroni

Kurs: Einblick in die generative Gestaltung mit processing ip971231
Kursleitung: Hanna Zuellig
Veroeffentlicht unter der creative common license Attribution-NonCommercial-ShareAlike
CC BY-NC-SA  http://creativecommons.org/licenses/
*/

//Wachstumsstruktur: Punkte werden neben vorherigen Punkt platziert

//max. Anzahl Kreise
int maxCount = 5000;
int currentCount = 1;
float[] x = new float[maxCount];
float[] y = new float[maxCount];

//Radius
float[] r = new float[maxCount];


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

  //Festlegung erster Kreis
  x[0] = width/2;
  y[0] = height/2;
  r[0] = 20;
}


void draw() {
  background(255);
  noFill();


  //Radius und Position werdern zufällig festgelegt.
  float newR = random(1, 7);
  float newX = random(0+newR, width-newR);
  float newY = random(0+newR, height-newR);
  
  
  float closestDist = 100000000;
  int closestIndex = 0;
  
  
  //Abfrage, welcher der Kreise am nächsten ist. Ist Distanz kleiner als alle anderen, wird ein Referenzwert in die Variable "closestIndex" gespeichert.
  for(int i=0; i < currentCount; i++) {
    float newDist = dist(newX,newY, x[i],y[i]);
    if (newDist < closestDist) {
      closestDist = newDist;
      closestIndex = i; 
    } 
  }

  //Neuer Kreis wird exakt neben dem nächst gelegenen Kreis positioniert. Dies geschieht durch Winkelberechnung mittels "atan2"
  float angle = atan2(newY-y[closestIndex], newX-x[closestIndex]);

  x[currentCount] = x[closestIndex] + cos(angle) * (r[closestIndex]+newR);
  y[currentCount] = y[closestIndex] + sin(angle) * (r[closestIndex]+newR);
  r[currentCount] = newR;
  currentCount++;

  //Kreise zeichnen
  for (int i=0 ; i < currentCount; i++) {
       int Alpha = 20+i/4;
       fill(0, 35, 75, Alpha);
       stroke(0, 35, 75, Alpha+5);
       ellipse(x[i],y[i], r[i]*2,r[i]*2); 
  }

  if (currentCount >= maxCount) noLoop();
  }