// Recursive Tree (w/ ArrayList) // Daniel Shiffman // Recursive branching "structure" without an explicitly recursive function // Instead we have an ArrayList to hold onto N number of elements // For every element in the ArrayList, we add 2 more elements, etc. (this is the recursion) // Created 2 May 2005 // An arraylist that will keep track of all current branches ArrayList a; void setup() { size(400,150); framerate(30); colorMode(RGB,25,15,255,100); background(100); smooth(); // Setup the arraylist and add one branch to it a = new ArrayList(); // A branch has a starting location, a starting "velocity", and a starting "timer" Branch b = new Branch(new Vector3D(width/2,height-20),new Vector3D(0f,-4.5f),10f); Branch c = new Branch(new Vector3D(width-70,height-20),new Vector3D(0f,-4.5f),10f); Branch d = new Branch(new Vector3D(width-330,height-20),new Vector3D(0f,-4.5f),10f); // Add to arraylist a.add(b); a.add(c); a.add(d); } void draw() { // Try erasing the background to see how it works // background(100); // Let's stop when the arraylist gets too big if (a.size() < 3000) { // For every branch in the arraylist for (int i = a.size()-1; i >= 0; i--) { // Get the branch, update and draw it Branch b = (Branch) a.get(i); b.update(); b.render(); // Get the branch, update and draw it Branch c = (Branch) a.get(i); c.update(); c.render(); // Get the branch, update and draw it Branch d = (Branch) a.get(i); d.update(); d.render(); // If it's ready to split if (b.timeToBranch()) { a.remove(i); // Delete it a.add(b.branch( 0f)); // Add one going up a.add(b.branch(45f)); // Add one going right a.add(b.branch(90f)); //add one going down-right a.add(b.branch(180f)); //add one going down-right a.add(b.branch(135f)); //add one going down-right a.add(b.branch( -0f)); // Add one going left a.add(b.branch(-45f)); // Add one going left a.add(b.branch(-90f)); //add one going down-left a.add(b.branch(-180f)); //add one going down-left a.add(b.branch(-135f)); //add one going down-left } if (c.timeToBranch()) { a.remove(i); // Delete it a.add(c.branch( 0f)); // Add one going up a.add(c.branch(45f)); // Add one going right a.add(c.branch(90f)); //add one going down-right a.add(c.branch(180f)); //add one going down-right a.add(c.branch(135f)); //add one going down-right a.add(c.branch( -0f)); // Add one going left a.add(c.branch(-45f)); // Add one going left a.add(c.branch(-90f)); //add one going down-left a.add(c.branch(-180f)); //add one going down-left a.add(c.branch(-135f)); //add one going down-left } if (d.timeToBranch()) { a.remove(i); // Delete it a.add(d.branch( 0f)); // Add one going up a.add(d.branch(45f)); // Add one going right a.add(d.branch(90f)); //add one going down-right a.add(d.branch(180f)); //add one going down-right a.add(d.branch(135f)); //add one going down-right a.add(d.branch( -0f)); // Add one going left a.add(d.branch(-45f)); // Add one going left a.add(d.branch(-90f)); //add one going down-left a.add(d.branch(-180f)); //add one going down-left a.add(d.branch(-135f)); //add one going down-left } } } }