int nb = 16, sym = 3, mirror = 1;
float ca, cr, nroot = random(123);
float[] tabAngles, tabRad;
tabAngles = new float[nb];
for (int i = 0; i < nb; i ++)
tabAngles[i] = random(PI/4, 1.8 * PI);
tabRad[i] = random(5, 80);
translate(width/2, height/2);
for (int i = nb-1; i > -1; i --)
tabAngles[i] += (noise(nroot + 10*i) - .45) * (i+3)/nb * PI / 10;
tabAngles[i] = constrain(tabAngles[i], .1, TWO_PI);
tabRad[i] += (noise(nroot - 10*i) - .45) * 2 * (i+3)/nb;
tabRad[i] = constrain(tabRad[i], 5, 80);
for (int k = 0; k < mirror+1; k ++)
for (int j = 0; j < sym+1; j ++)
ca = map(mouseX, 0, width, 0.2, 1);
cr = map(mouseY, 0, height, .2, 2);
for (int i = 0; i < nb; i ++)
arc(0, 0, cr*tabRad[i], cr*tabRad[i], i % 2 == 0 ? 0 : -ca*tabAngles[i], i % 2 == 0 ? ca*tabAngles[i] : 0);
rotate((ca*tabAngles[i] + PI) * (i % 2 == 0 ? 1 : -1));
translate(-cr*tabRad[i] / 2, 0);
if (i < nb-1) translate(-cr*tabRad[i+1] / 2, 0);
if(keyCode == LEFT) sym = sym-1 < 1 ? 1 : sym-1;
else if(keyCode == RIGHT) sym = sym+1 > 7 ? 7 : sym+1;
else if(keyCode == DOWN) mirror = (mirror+1) % 2;
float R, G, B, Rspeed, Gspeed, Bspeed;
final static float minSpeed = .2;
final static float maxSpeed = .8;
Rspeed = (random(1) > .5 ? 1 : -1) * random(minSpeed, maxSpeed);
Gspeed = (random(1) > .5 ? 1 : -1) * random(minSpeed, maxSpeed);
Bspeed = (random(1) > .5 ? 1 : -1) * random(minSpeed, maxSpeed);
Rspeed = ((R += Rspeed) > 255 || (R < 0)) ? -Rspeed : Rspeed;
Gspeed = ((G += Gspeed) > 255 || (G < 0)) ? -Gspeed : Gspeed;
Bspeed = ((B += Bspeed) > 255 || (B < 0)) ? -Bspeed : Bspeed;