float outerlimit, limit ; final float limitbound = 1 ; boolean rotting = false ; RecursiveShape drawer = new Dill(); int [] startrgb = {60, 50, 12} ; // dull brown stalk int [] endrgb = {77, 206, 52} ; // green int [] distrgb = {endrgb[0]-startrgb[0], endrgb[1]-startrgb[1], endrgb[2]-startrgb[2]}; int DEBUGSEQ = 0 ; void setup() { fullScreen(P2D); // size(800, 800, P2D); outerlimit = limit = height * 7.0 / 8.0 ; background(0,32,0); stroke(255); frameRate(1); } void draw() { if (limit <= limitbound) { if (! rotting) { rotting = true ; } else { //saveFrame("saveFrames/ZZZ-######.png"); return ; } } else if (rotting && limit > outerlimit) { background(0,32,0); //saveFrame("saveFrames/ZZZ-######.png"); // Changed Feb 2020 return ; rotting = false ; } DEBUGSEQ++ ; if (DEBUGSEQ < 2) { // saveFrame("saveFrames/ZZZ-######.png"); return ; } if (rotting) { background(0,32,0); } // background(0); pushMatrix(); float hmargin = (height - outerlimit) / 2 ; translate(width/2, height-hmargin); scale(1, -1); drawer.drawRecursiveShape(outerlimit, limit); rotate(radians(30)); scale(.5, .5); drawer.drawRecursiveShape(outerlimit, limit); rotate(radians(-60)); // scale(.5, .5); drawer.drawRecursiveShape(outerlimit, limit); if (! rotting) { limit = limit / 2 ; } else { limit = limit * 2 ; /* if (limit > width) { // added Feb 9, 2020 rotting = false ; } */ } popMatrix(); // saveFrame("saveFrames/ZZZ-######.png"); } interface RecursiveShape { void drawRecursiveShape(float len, float limit); } class Dill implements RecursiveShape { void drawRecursiveShape(float len, float limit) { int myred = round(((outerlimit-len)/outerlimit) * distrgb[0] + startrgb[0]); int mygreen = round(((outerlimit-len)/outerlimit) * distrgb[1] + startrgb[1]); int myblue = round(((outerlimit-len)/outerlimit) * distrgb[2] + startrgb[2]); int sw = round(constrain(len/outerlimit*10, 1, 10)); int alp = round(constrain((len)/outerlimit*255, 50, 255)); // alp = 255; strokeCap(PROJECT); strokeWeight(sw); // blendMode(BLEND); // println("DEBUG RGB " + DEBUGSEQ + ": " + myred + "," + mygreen + "," + myblue); stroke(myred, mygreen, myblue, alp); fill(myred, mygreen, myblue, alp); if (len <= limit) { line(0, 0, 0, len); } else { // line(0, 0, 0, len); float seg1 = len * 2.0 / 5 ; float seg2 = len / 15.0 ; line(0, 0, 0, seg1+seg2); // blendMode(MULTIPLY); // line(0,0,0,seg1); translate(0, seg1); rotate(radians(30)); drawRecursiveShape(len/2, limit); rotate(radians(-30)); translate(0, seg2); rotate(radians(-30)); drawRecursiveShape(len/2, limit); rotate(radians(30)); drawRecursiveShape(len-(seg1+seg2), limit); translate(0,-(seg1+seg2)); } } }