boolean isDrawing = false;
if (isDrawing == false && numTrees <= 70) {
float sze = random(50, 250);
branch(random(-50, width+50), height+5, -PI/2, sze, sze/10, 0);
void branch(float startX, float startY, float ang, float len, float wt, float col) {
if (len > 50) numSegs = 10;
else if (len > 30 && len <= 50) numSegs = 5;
else if (len <= 30) numSegs = 1;
float segLen = len / numSegs;
float nextSegWt = wt * 0.6;
for (int i = 0; i < numSegs; i++) {
float varyAng = random(-PI/2, PI/2) * 0.05;
float varySegLen = random(0.5, 1.5);
float endX = startX + cos(ang + varyAng) * (segLen * varySegLen);
float endY = startY + sin(ang + varyAng) * (segLen * varySegLen);
float segWeight = map(i, 0, numSegs, wt, nextSegWt);
drawBranchSeg(startX, startY, endX, endY, segWeight, col);
branch(startX, startY, ang + random(-PI/6, 0), len, nextSegWt, col);
branch(startX, startY, ang + random(PI/6), len, nextSegWt, col);
int numBranches = (int)random(2, 4);
for (int i = 0; i < numBranches; i++) {
float newAng = ang + random(-PI/4, PI/4);
branch(startX, startY, newAng, len, nextSegWt, col);
void drawBranchSeg(float startX, float startY, float endX, float endY, float wt, float col) {
float len = sqrt(sq(endX - startX) + sq(endY-startY));
stroke(col+((180-col)/2), 200);
line(startX, startY, endX, endY);
translate(startX, startY);
rotate(-PI/2 + atan2(endY-startY, endX-startX));
float incr = (220 - col)/wt;
for (int i = 0; i <= wt; i++) {
for (int j = 0; j < wt* 2; j++) {
float x = random(-((wt/2)-(wt/20)), (wt/2)-(wt/20));
ellipse(x, y, wt * random( 0.1, 0.15), wt * random(0.1, 0.15));
ellipse(x, y, wt * random(0.005, 0.1), wt * random (0.005, 0.1));
for (float i = 0; i < height; ++i) {
stroke(lerpColor(c1, c2, i/height));