// Romanesco - Jim Bumgardner // // A fractal that resembles Romanesco Broccoli int nbr_circles = 100; float phi = (sqrt(5)+1)/2 - 1; // golden ratio float golden_angle = phi * TWO_PI; // golden angle void setup() { size(500,500); smooth(); background(64,0,64); fill(192,255,128); noStroke(); noLoop(); } void draw() { drawFSpiral(width/2, height/2-8, width*.45, 3); } void drawFSpiral(float cx, float cy, float rad, int level) { if (level == 0 || rad < 1) { ellipse(cx, cy, rad*2, rad*2); } else { float deviation = (nbr_circles-1)/(float) (nbr_circles); float lg_area = sq(rad) * PI; float mean_area = lg_area / nbr_circles; float min_area = mean_area * (1-deviation); float max_area = mean_area * (1+deviation); float cum_area = 0; for (int i = 1; i <= nbr_circles; ++i) { float angle = i*golden_angle; float ratio = i / (float) nbr_circles; float sm_area = map(ratio,0,1,min_area,max_area); float sm_dia = 2 * sqrt( sm_area / PI ); float adj_sm_dia = sm_dia; cum_area += sm_area; float spiral_rad = sqrt( cum_area / PI ); float x = cx + cos(angle) * spiral_rad; float y = cy + sin(angle) * spiral_rad; y += pow(2,level)*ratio; drawFSpiral(x, y, adj_sm_dia/2, level-1); } } }