void setup() { size(600, 600); smooth(); } boolean shouldDraw = true; Spiral s; int colour = 0; void draw() { background(100); //noStroke(); if(shouldDraw) { colour = 0; Point origin = new Point(width/2, height/2); s = new Spiral(origin, new Point((int)random(-100,100),(int)random(-100,100))); shouldDraw = false; } s.draw(); } void mouseReleased() { shouldDraw = true; } class Spiral { Point segments[]; HashMap children; Point start; Point vector; boolean finished = false; boolean canParent = true; int direction = 1; int depth; Spiral(Point start, Point vector, int depth) { this(start, vector); this.depth = depth; if(depth<0) { canParent = false; println("can't parent"); } } Spiral(Point start, Point vector) { direction = random(0,1)>0.5?1:-1; finished = false; this.start = start; this.vector = vector; children = new HashMap(); depth = 3; segments = new Point[20];//(int)random(10,12)]; generateSpiral(); } void generateSpiral() { segments[0] = new Point(start.x, start.y); segments[1] = new Point(start.x+vector.x, start.y+vector.y); for(int i = 2; i < segments.length; i++) { float distance = (float)segments[i-2].distance(segments[i-1]); float angle = atan2((segments[i-1].y - segments[i-2].y),(segments[i-1].x - segments[i-2].x)); println(angle + " " +distance); if(distance<10) { Point temp[] = new Point[i-1]; for(int a = 0; a < i-1; a++) { temp[a] = segments[a]; } segments = temp; return; } angle += 0.5*direction; segments[i] = new Point(); segments[i].x = segments[i-1].x+(int)((distance*0.95)*cos(angle)); segments[i].y = segments[i-1].y+(int)((distance*0.95)*sin(angle)); if(canParent) { if(random(0,5)>3) { println("random"); Point vector = new Point(segments[i].x - segments[i-1].x, segments[i].y - segments[i-1].y); vector.x *= random(0.6,0.9); vector.y *= random(0.6, 0.9); Spiral s = new Spiral(segments[i-1], vector, depth-1); children.put(""+i, s); } } } } int pos = 0; void draw() { // ellipse(segments[0].x, segments[0].y, 2,2); for(int i = 1; i < pos; i++) { drawPill(segments[i-1], segments[i], segments.length-i, (segments.length-1)-i); //line(segments[i-1].x, segments[i-1].y, segments[i].x, segments[i].y); //ellipse(segments[i].x, segments[i].y, 2,2); Object child = children.get(""+i); if(child!=null) { ((Spiral)child).draw(); } } if(pos