float zDist = 11, zmin = -150, zmax = 250, zstep = 2.8, rad = 200;
int nb = int((zmax - zmin) / zDist);
PVector[] circles = new PVector[nb];
color[] colors = new color[nb];
Boolean bnw = true, dots = false;
for (int i = 0; i < nb; i++) {
circles[i] = new PVector(0, 0, map(i, 0, nb - 1, zmax, zmin));
colors[i] = color(random(110, 255), 0, random(60, 150));
colors[i] = color(random(220, 255), 255, 255);
translate(width/2, height/2);
float fc = (float)frameCount, a;
if (dots) beginShape(POINTS);
for (int i = 0; i < nb; i++) {
pv.x = (noise((fc*2 + pv.z) / 550) - .5) * height * map(pv.z, zmin, zmax, 6, 0);
pv.y = (noise((fc*2 - 3000 - pv.z) / 550) - .5) * height * map(pv.z, zmin, zmax, 6, 0);
a = map(pv.z, zmin, zmax, 0, 255);
if (!bnw)stroke(colors[i], a);
else stroke(map(pv.z, zmin, zmax, 0, 255), a);
float r = map(pv.z, zmin, zmax, rad*.1, rad);
for (int j = 0; j < jmax; j++)
vertex(pv.x + r*cos(j*TWO_PI/jmax + fc/40)/2, pv.y + r*sin(j*TWO_PI/jmax + fc/40)/2, pv.z);
translate(pv.x, pv.y, pv.z);
void keyPressed(){dots = !dots;}
void mousePressed(){bnw = !bnw;}