Using p5.js to reproduce these plant growth graphics from page 37 of ‘The Algorithmic Beauty of Plants’ (Prusinkiewicz and Lindenmayer, 2004).

This process was fraught with erroneous but interesting outcomes.




























HACKING with microphone input: continuous sound waves alter discrete outputs:

//d
//n=7,δ=25.7◦
//X
//X→F[+X][-X]FX
//F→FF
var mic;
var angle;
var axiom = "X";
var sentence = axiom;
var len = 8;
var rules = [];
rules[0] = {
a: "X",
b: "F[+X][-X]FX",
};
rules[1] = {
a: "F",
b: "FF",
};
let counter = 0;
let lastDraw = Date.now();
var iterations = 1;
var queue = [];
function setIterations() {
var vol = mic.getLevel() * 1000;
console.log(vol);
//vol is between 1 and 200
// len *= 100*vol;
if (vol > 20) {
iterations = 7;
}
else if (vol > 10) {
iterations = 6;
}
else if (vol > 7) {
iterations = 5;
}
else if (vol > 5) {
iterations = 4;
}
else if (vol > 3) {
iterations = 3;
}
else if (vol > 2) {
iterations = 2;
}
else {
iterations = 1;
}
}
function turtle() {
console.log("In Turtle")
console.log(sentence.length)
background(51);
resetMatrix();
translate(width / 2, height);
stroke(255, 100);
for (var i = 0; i < sentence.length; i++) {
var current = sentence.charAt(i);
if (current == "F") {
line(0, 0, 0, -len);
translate(0, -len);
} else if (current == "+") {
rotate(angle);
} else if (current == "-") {
rotate(-angle);
} else if (current == "[") {
push();
} else if (current == "]") {
pop();
}
}
}
function generate() {
setIterations();
for (var k = 0; k < iterations; k++) {
var nextSentence = "";
for (var i = 0; i < sentence.length; i++) {
var current = sentence.charAt(i);
var found = false;
for (var j = 0; j < rules.length; j++) {
if (current == rules[j].a) {
found = true;
nextSentence += rules[j].b;
break;
}
}
if (!found) {
nextSentence += current;
}
// if (nextSentence.length > 500) {
// break;
// }
}
sentence = nextSentence;
createP(sentence);
turtle();
}
}
function draw() {
if(Date.now() - lastDraw > 125 ) {
lastDraw = Date.now()
axiom = "X";
sentence = axiom;
generate();
}
// generate();
}
function setup() {
createCanvas(500, 1000);
angle = radians(25.7);
background(51);
createP(axiom);
mic = new p5.AudioIn();
mic.start();
draw();
// turtle();
// var button = createButton("generate");
// button.mousePressed(generate);
}
Thinking through stitching: exploring and modelling the ideas expounded upon in ‘Literature down to a pixel’ regarding digital and analogue signals, and the idea of information that is “static” yet “fundamentally dynamic” (Tenen, 2017).

