xxxxxxxxxx
149
// some stuff to make it cooler:
// - clustering?
// - more interesting motion ig
let path = [];
let zoomLvl = 0;
let zoomPos = [0,0];
let coord = 0;
let pathslider;
let leftorright = -1;
let angleSteps = 1/12;
let leafSize = 100;
let branchStep = 20;
function setup() {
createCanvas(500, 500);
background(255);
pathslider = createSlider(0,10000,10000).style('width', width+'px');
createButton('reset zoom').mousePressed(resetZoom);
createButton('csv').mousePressed(saveCSV);
//generate path here all at once
path = [[width/2, height/2]];
growFlower(0);
}
function draw() {
background(255);
drawPath(); //draws the path
}
// phases: (1) growing branch & (2) growing flower, (3) retracing
// 1: iterate in a line, options: continue, flower, return
// 2: iterate in a circle, options: leaf, branch (return after circle)
// 3: retrace to last flower
function growFlower(angle){
leafSize = random(15,100)
flowerLoop((angle+PI)%(2*PI),0);
print(path);
}
function flowerLoop(angle, goneround){
// if(random()>0.9){
// growBranch(angle);
// }
// else{
// growLeaf(angle);
// }
growLeaf(angle-0.25*PI,path[path.length-1]);
if(goneround<1){
flowerLoop((angle+(2*PI*angleSteps)%(2*PI)), goneround + angleSteps);
}
else{
growBranch((angle+PI)%(2*PI));
}
}
function growBranch(angle){
path.push([path[path.length-1][0] + cos(angle)*branchStep, path[path.length-1][1] + sin(angle)*branchStep]);
if(random()>0.99){
pathslider.remove();
pathslider = createSlider(0,path.length,path.length).style('width', width+'px');
pathslider.position(0,height+20)
return
}
if(random()>0.1){
growBranch(angle+ random(-0.3,0.3))
}
else{
leafSize = random(15,100)
flowerLoop((angle+PI)%(2*PI), 0);
}
}
function growLeaf(angle,coord){
for(let t=0;t<PI+0.001;t+=PI*angleSteps){
path.push([coord[0] + leafSize * ( 0.1 * sin(2*t) * cos(angle) - sin(t)*sin(angle) ),
coord[1] + leafSize * ( 0.1 * sin(2*t) * sin(angle) + sin(t)*cos(angle) )]);
}
}
//drawing functions
function drawPath(){
push()
stroke(0);
translate(-0.5*width*(2**zoomLvl-1),-0.5*height*(2**zoomLvl-1));
scale(2**zoomLvl);
strokeWeight(1/(2**zoomLvl));
if(mouseIsPressed && mouseX<width && mouseY<height){
zoomPos[0] += mouseX-pmouseX;
zoomPos[1] += mouseY-pmouseY;
}
translate(zoomPos[0],zoomPos[1]);
noFill();
beginShape();
for(let i=1;i<min(path.length,pathslider.value());i++){
vertex(path[i][0],path[i][1]);
}
endShape();
pop();
noStroke();
fill(255);
rect(0,0,120,50);
fill(0);
text("zoomlvl: " + zoomLvl, 10, 15)
text("stitch count: " + path.length, 10, 25)
text("fps: " + floor(frameRate()), 10, 35)
}
function mouseWheel(event){
zoomLvl += Math.sign(event.deltaY) *0.3;
}
function resetZoom(){
zoomLvl = 0;
zoomPos = [0,0];
}
function saveCSV(){
let table = new p5.Table();
table.addColumn('x');
table.addColumn('y');
for(let i=0;i<path.length;i++){
let newRow = table.addRow();
newRow.setString('x', path[i][0]);
newRow.setString('y', path[i][1]);
}
saveTable(table, 'path.csv');
}