// Petals // mike [at] lightcycle [dot] org int[][] vertices; int v = 15, nextv = 15; int mod = 4, nextmod = 4; int slices = 10, nextslices = 10; float range = TWO_PI; boolean changePending = true; boolean interactive = false; int t = 0; void setup() { size(400, 300); background(64); stroke(200, 128, 128); } void loop() { v = nextv; mod = nextmod; slices = nextslices; translate(width/2, height/2); if (interactive) { rotateZ((float)mouseX/width * TWO_PI); rotateY((float)mouseY/height * TWO_PI); } else { if (t % 100 == 50) changePending = true; t++; rotateY((float)t * PI/100); } scale(0.8); // Setup new vertices if (changePending) { vertices = new int[v][2]; changePending = false; for (int i = 0; i < mod; i++) { int x = (int)random(width) - width/2; int y = (int)random(height) - height/2; for (int j = 0; j < v; j += mod) { vertices[max(0, min(v-1, i + j))][0] = x; vertices[max(0, min(v-1, i + j))][1] = y; } } } // Draw object for (int s = 0; s < slices; s++) { beginShape(LINE_STRIP); for (int i = 0; i < v; i++) bezierVertex(vertices[i][0], vertices[i][1]); endShape(); rotateX(range/slices); } } void mousePressed() { changePending = true; } void keyPressed() { switch(key) { case 'v': if (nextv > 1) nextv--; changePending = true; break; case 'V': nextv++; changePending = true; break; case 'm': if (nextmod > 1) nextmod--; changePending = true; break; case 'M': nextmod++; changePending = true; break; case 's': if (nextslices > 1) nextslices--; break; case 'S': nextslices++; break; case ' ': interactive = !interactive; break; } }