float rot = 0, rotSpeed = .04;
translate(width/2, height/2);
doThis(frameCount/20.0 + PI);
void doThis(float omega) {
for (int i = 0; i <= nb; i ++) {
float theta = i * TWO_PI/nb;
float dr = (theta - rot);
if (abs(dr) > spreadAngle) {
deltaTheta = map(abs(dr), 0, spreadAngle, 1, 0);
float deltaRadCoeff = deltaTheta * cos(omega + map(i, 0, nb, 0, nbCycles*TWO_PI));
float r = rad + deltaRad * deltaRadCoeff;
vertex(r * cos(theta), r * sin(theta));
deltaRadCoeff *= cos(map(i, 0, nb/4, -PI/2, PI/2));
x = map(i, 0, nb/4, -rad, rad);
y = -rad + deltaRadCoeff * deltaRad;
deltaRadCoeff *= cos(map(i, nb/4, nb/2, -PI/2, PI/2));
x = rad + deltaRadCoeff * deltaRad;
y = map(i, nb/4, nb/2, -rad, rad);
deltaRadCoeff *= cos(map(i, nb/2, 3*nb/4, -PI/2, PI/2));
x = map(i, nb/2, 3*nb/4, rad, -rad);
y = rad + deltaRadCoeff * deltaRad;
deltaRadCoeff *= cos(map(i, 3*nb/4, nb, -PI/2, PI/2));
x = -rad + deltaRadCoeff * deltaRad;
y = map(i, 3*nb/4, nb, rad, -rad);