int LOOP_NUM = 40;
ArrayList<ArrayList<Vertex>> verticiesList;
float time;
void setup(){
size(500, 500);
frameRate(60);
smooth();
time = 0;
verticiesList = new ArrayList<ArrayList<Vertex>>();
float angle = 0.0;
ArrayList<Vertex> verticies = new ArrayList<Vertex>();
while(angle < 358){
angle += map(random(1), 0, 1, 5, 10);
verticies.add(new Vertex(0, angle));
}
verticiesList.add(verticies);
for(int i = 0; i < LOOP_NUM - 1; i++){
ArrayList<Vertex> preVerticies = verticiesList.get(i);
ArrayList<Vertex> nextVerticies = new ArrayList<Vertex>();
for(Vertex v: preVerticies){
float r = v.getRadious(time);
nextVerticies.add(new Vertex(r, v.angle));
}
verticiesList.add(nextVerticies);
}
}
void draw(){
float time = frameCount * 0.01;
background(255);
noFill();
stroke(0);
strokeWeight(1);
translate(width / 2, height / 2);
beginShape();
for(Vertex v: verticiesList.get(0)){
float radious = v.getRadious(time);
curveVertex(radious * cos(radians(v.angle)), radious * sin(radians(v.angle)));
}
for(int vi = 0; vi < 3; vi++){
Vertex v = verticiesList.get(0).get(vi);
float radious = v.getRadious(time);
curveVertex(radious * cos(radians(v.angle)), radious * sin(radians(v.angle)));
}
endShape();
for(int i = 0; i < LOOP_NUM - 1; i++){
ArrayList<Vertex> preVerticies = verticiesList.get(i);
ArrayList<Vertex> curVerticies = verticiesList.get(i + 1);
beginShape();
for(int vi = 0; vi < preVerticies.size(); vi++){
Vertex preVertex = preVerticies.get(vi);
Vertex curVertex = curVerticies.get(vi);
curVertex.setPreRadious(preVertex.getRadious(time));
float radious = curVertex.getRadious(time);
curveVertex(radious * cos(radians(curVertex.angle)), radious * sin(radians(curVertex.angle)));
}
for(int vi = 0; vi < 3; vi++){
Vertex v = curVerticies.get(vi);
float radious = v.getRadious(time);
curveVertex(radious * cos(radians(v.angle)), radious * sin(radians(v.angle)));
}
endShape();
}
}
class Vertex{
float preRadious;
float angle;
float gapNoise;
Vertex(float preRadious, float angle){
this.preRadious = preRadious;
this.angle = angle;
gapNoise = random(100);
}
void setPreRadious(float preRadious){
this.preRadious = preRadious;
}
float getRadious(float time){
return preRadious + map(noise(gapNoise + time), 0, 1, 3, 10);
}
}