ArrayList<Arc> arcs = new ArrayList<Arc>();
void setup(){
size(500, 500);
arcs = new ArrayList<Arc>();
for(int i = 0; i < 10; i++){
arcs.add(new Arc());
}
}
void draw(){
colorMode(RGB, 255);
background(32);
translate(width / 2, height / 2);
ArrayList<Arc> nextArcs = new ArrayList<Arc>();
for(Arc a: arcs){
a.update();
a.display();
if(!a.isDiappeared()){
nextArcs.add(a);
}
}
arcs = nextArcs;
if(random(1) < 0.15){
arcs.add(new Arc());
}
}
class Arc{
float ang1, ang2, end1, end2;
boolean clockwise;
float diameter;
float hue, sat, bri;
Arc(){
end1 = random(TWO_PI);
end2 = end1 + random(TWO_PI);
ang1 = ang2 = end1;
diameter = random(20, height);
clockwise = random(1) < 0.5 ? true: false;
hue = random(40, 120);
sat = random(40, 100);
bri = random(40, 100);
}
void update(){
if(ang2 != end2){
ang2 += PI / 64;
if(ang2 >= end2){
ang2 = end2;
}
} else if(ang1 != end2){
ang1 += PI / 64;
if(ang1 >= end2){
ang1 = end2;
}
}
}
void display(){
colorMode(HSB, 360, 100, 100);
stroke(hue, sat, bri, 255);
strokeWeight(3);
noFill();
if(clockwise){
arc(0, 0, diameter, diameter, ang1, ang2);
} else {
if(ang2 != end2){
arc(0, 0, diameter, diameter, ang1 - (ang2 - ang1), ang1);
} else {
arc(0, 0, diameter, diameter, end1 - (end2 - end1), end1 - (end2 - end1) + (ang2 - ang1));
}
}
}
boolean isDiappeared(){
return ang1 == end2 && ang2 == end2;
}
}