// P_2_2_3_02
//
// 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
//
// http://www.generative-gestaltung.de
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* form mophing process by connected random agents
* two forms: circle and line
*
* MOUSE
* click : start a new circe
* position x/y : direction and speed of floating
*
* KEYS
* 1-2 : fill styles
* 3-4 : form styles circle/line
* arrow up/down : step size +/-
* f : freeze. loop on/off
* Delete/Backspace : clear display
* s : save png
*/
var formResolution = 15;
var stepSize = 2;
var distortionFactor = 1;
var initRadius = 150;
var centerX, centerY;
var x = [];
var y = [];
var filled = false;
var freeze = false;
var mode = 0;
function setup(){
// use fullscreen size
createCanvas(780, 780);
smooth();
// init form
centerX = width/2;
centerY = height/2;
var angle = radians(360/float(formResolution));
for (var i=0; i<formResolution; i++){
x[i] = cos(angle*i) * initRadius;
y[i] = sin(angle*i) * initRadius;
}
stroke(0, 50);
background(255);
}
function draw(){
// floating towards mouse position
if (mouseX != 0 || mouseY != 0) {
centerX += (mouseX-centerX) * 0.01;
centerY += (mouseY-centerY) * 0.01;
}
// calculate new points
for (var i=0; i<formResolution; i++){
x[i] += random(-stepSize,stepSize);
y[i] += random(-stepSize,stepSize);
// ellipse(x[i], y[i], 5, 5);
}
strokeWeight(0.75);
if (filled) fill(random(255));
else noFill();
if (mode == 0) {
beginShape();
// start controlpoint
curveVertex(x[formResolution-1]+centerX, y[formResolution-1]+centerY);
// only these points are drawn
for (var i=0; i<formResolution; i++){
curveVertex(x[i]+centerX, y[i]+centerY);
}
curveVertex(x[0]+centerX, y[0]+centerY);
// end controlpoint
curveVertex(x[1]+centerX, y[1]+centerY);
endShape();
}
if (mode == 1) {
beginShape();
// start controlpoint
curveVertex(x[0]+centerX, y[0]+centerY);
// only these points are drawn
for (var i=0; i<formResolution; i++){
curveVertex(x[i]+centerX, y[i]+centerY);
}
// end controlpoint
curveVertex(x[formResolution-1]+centerX, y[formResolution-1]+centerY);
endShape();
}
}
function mousePressed() {
// init forms on mouse position
centerX = mouseX;
centerY = mouseY;
// circle
if (mode == 0) {
centerX = mouseX;
centerY = mouseY;
var angle = radians(360/float(formResolution));
var radius = initRadius * random(0.5,1.0);
for (var i=0; i<formResolution; i++){
x[i] = cos(angle*i) * radius;
y[i] = sin(angle*i) * radius;
}
}
// line
if (mode == 1) {
centerX = mouseX;
centerY = mouseY;
var radius = initRadius * random(0.5,5.0);
var angle = random(PI);
radius = initRadius*4;
angle = 0;
var x1 = cos(angle) * radius;
var y1 = sin(angle) * radius;
var x2 = cos(angle-PI) * radius;
var y2 = sin(angle-PI) * radius;
for(var i=0; i<formResolution; i++) {
x[i] = lerp(x1, x2, i/float(formResolution));
y[i] = lerp(y1, y2, i/float(formResolution));
}
}
}
function keyPressed() {
if (keyCode == UP_ARROW) stepSize++;
if (keyCode == DOWN_ARROW) stepSize--;
stepSize = max(stepSize, 1);
println("stepSize: " + stepSize);
if (keyCode == DELETE || keyCode == BACKSPACE) background(255);
}
function keyTyped() {
if (key == 's' || key == 'S') save("P_2_2_3_02.png");
if (key == '1') filled = false;
if (key == '2') filled = true;
if (key == '3') mode = 0;
if (key == '4') mode = 1;
// switch draw loop on/off
if (key == 'f' || key == 'F') freeze = !freeze;
if (freeze == true) noLoop();
else loop();
}