// Tree drawing (Processing) // Jacob Bandes-Storch, April 2010 class Node { ArrayList children = new ArrayList(); int x = 0, y = 0; int numberLeft(int leftNum) { x = leftNum; for (Node n : children) { leftNum = n.numberLeft(leftNum+1); } return leftNum; } int numberRight(int rightNum) { ArrayList rev = reversed(children); y = rightNum; for (Node n : rev) { rightNum = n.numberRight(rightNum+1); } return rightNum; } void populate(int maxChildren, int maxDepth) { if (maxDepth <= 0) return; int i; int r = random(maxChildren); for (i = 0; i < r; i++) { Node n = new Node(); n.populate(maxChildren, maxDepth - 1); children.add(n); } } } ArrayList reversed(ArrayList l) { ArrayList l2 = new ArrayList(); for (int i = l.size()-1; i >= 0; i--) { l2.add(l.get(i)); } return l2; } Node tree = null; void retree() { tree = new Node(); tree.populate(4, 3); tree.numberLeft(0); tree.numberRight(0); redraw(); } void setup() { size(351, 351); smooth(); noLoop(); retree(); } void mousePressed() { retree(); } void mouseMoved() { redraw(); } void draw() { background(#cccccc); pushStyle(); fill(#99c7cc); noStroke(); rect(0, 0, 10*ceil(mouseX/10.0), 10*ceil(mouseY/10.0)); stroke(#999999); for (int i = 0; i < width; i += 10) { line(0, i, width, i); line(i, 0, i, height); } popStyle(); Queue q = new ArrayList(); Node n = tree; while (n != null) { if (!n.children.isEmpty()) { for (Node c : n.children) { q.add(c); line(n.x*10+5, n.y*10+5, c.x*10+5, c.y*10+5); } } rect(n.x*10+2, n.y*10+2, 6, 6); n = q.size() > 0 ? q.remove(0) : null; } }