// Recursive Tree (w/ ArrayList) // Daniel Shiffman // A class for one branch in the system // Created 2 May 2005 class Branch { // Each has a location, velocity, and timer // We could implement this same idea with different data Vector3D loc; Vector3D vel; float timer; float timerstart; float branchWidth; Branch(Vector3D l, Vector3D v, float n, float w) { loc = l.copy(); vel = v.copy(); timerstart = n; timer = timerstart; branchWidth = w; } // Move location void update() { loc.add(vel); } // Draw a dot at location void render() { noStroke(); ellipseMode(CENTER); fill(random(40,100),random(200,255),random(20,80)); ellipse(loc.x,loc.y,branchWidth,branchWidth); } // Did the timer run out? boolean timeToBranch() { timer--; if (timer < 0) { branchWidth = branchWidth * 0.7; return true; } else { return false; } } // Create a new branch at the current location, but change direction by a given angle Branch branch(float angle) { // What is my current heading float theta = vel.heading2D(); // What is my current speed float mag = vel.magnitude(); // Turn me theta += radians(angle); // Look, polar coordinates to cartesian!! Vector3D newvel = new Vector3D(mag*cos(theta),mag*sin(theta)); // Return a new Branch return new Branch(loc,newvel,timerstart*0.66f,branchWidth); } }