//A complete binary tree has pow(2,k) nodes at every depth k < n and between pow(2,n) and pow(2,n+1)-1 nodes altogether BTree btree; void setup(){ size(400, 400); btree = new BTree(5, height / 2, 8); smooth(); ellipseMode(CENTER); } void draw(){ background(255); btree.draw(); } class BTree{ int depth; Vec2 [] node; BTree(float x, float y, int depth){ this.depth = depth; node = new Vec2[(int)pow(2,depth + 1)]; node[1] = new Vec2(x, y); for(int i = 1; i < node.length - (int)pow(2, depth); i++){ float xn = node[i].x + cos(random(1.0)) * (50.0); float yn = node[i].y + sin(random(1.0)) * (50.0); node[2 * i] = new Vec2(xn, yn); xn = node[i].x + cos(-random(1.0)) * (50.0); yn = node[i].y + sin(-random(1.0)) * (50.0); node[1 + 2 * i] = new Vec2(xn, yn); } } void draw(){ for(int i = 1; i < node.length - (int)pow(2, depth); i++){ line(node[i].x, node[i].y, node[2 * i].x, node[2 * i].y); line(node[i].x, node[i].y, node[1 + 2 * i].x, node[1 + 2 * i].y); } for(int i = 1; i < node.length; i++){ ellipse(node[i].x, node[i].y, 10, 10); node[i].dither(); } } } class Vec2{ float x,y; Vec2(float x, float y){ this.x = x; this.y = y; } void dither(){ x += random(-1.0, 1.0); y += random(-1.0, 1.0); } }