Disegnare un albero

Munari's Augmented
Adesso che, come penso, vi sarà chiaro come disegnare un albero, non dovete seguire pedestremente quello che vi ho mostrato; se la regola ormai vi è nota potete disegnare l’albero che volete, tutto diverso da quello che avete visto in questo libro. Potete disegnarli con la matita, con la penna, col pennarello, col pennello, con il pastello, col gesso, con un pezzo di mattone, col carboncino, di cartone ondulato di carta da pacchi, di rete metallica, di plastica e mica di plastica, di cartapesta, di filo di ferro, di ottone, di alluminio, di spago, di spaghetti, di panno, di quello che vi pare. E poi, soprattutto, insegnatelo ad altri.” Bruno Munari in Disegnare un albero
E noi aggiungiamo … e adesso che la regola vi è nota potreste disegnarli con il codice …

show code

Branch branch;

int depth = 13;
float startLength = 100;
float lengthMultiplied = 0.5; // at least 2?
float theAngle = PI/2.5;

void setup(){
size(400,400);

branch = new Branch(width/2,height,startLength,PI/2, 0); // x y l a
}

void draw(){
background(255);
branch.drawBranch();

theAngle = map(mouseY,height,0,0,PI);
lengthMultiplied = map(mouseX,0,width,0,1);

branch.updateBranches(width/2,height,startLength,PI/2);

}

class Branch{

float l;
float sX;
float sY;
float eX;
float eY;
float angle;

int number;

Branch firstBranch;
Branch secondBranch;

Branch(float tX, float tY, float tL, float tA, int tNumber){
number = tNumber;

sX = tX;
sY = tY;
l = tL;
angle = tA;

eY = sY - sin(angle) * l;
eX = sX + cos(angle) * l;

if(number < depth){
nextBranches();
}
}

void drawBranch(){
float lineWidth = depth;

for(int i = 0; i < number; i++){
lineWidth/=1.5;
}

strokeWeight(lineWidth);

line(sX,sY,eX,eY);

if(firstBranch != null){
firstBranch.drawBranch();
}
if(secondBranch != null){
secondBranch.drawBranch();
}
}

void nextBranches(){
firstBranch = new Branch(eX, eY, l*lengthMultiplied, angle+theAngle, number+1);
secondBranch = new Branch(eX, eY, l*lengthMultiplied, angle-theAngle, number+1);
}

void updateBranches(float tX, float tY, float tL, float tA){
if(number != 0){
// change angle
sX = tX;
sY = tY;
l = tL;
angle = tA;

eY = sY - sin(angle) * l;
eX = sX + cos(angle) * l;
}

// update next
if(number < depth){
firstBranch.updateBranches(eX, eY, l*lengthMultiplied, angle+theAngle);
secondBranch.updateBranches(eX, eY, l*lengthMultiplied, angle-theAngle);
}
}
}

"Interactive Fractal Tree" by David King, licensed under Creative Commons Attribution-Share Alike 3.0 and GNU GPL license. Work: http://openprocessing.org/visuals/?visualID= 152843