ArrayList<Triangle> triangles;
void setup(){
size(500, 500);
colorMode(HSB, 360, 100, 100);
triangles = new ArrayList<Triangle>();
Triangle root = new Triangle();
triangles.add(root);
for(int i = 0; i < 20; i++){
Triangle tri = triangles.get(triangles.size() - 1);
triangles.add(tri.makeChild());
}
}
void draw(){
translate(width / 2, height / 2);
rotate(frameCount * 0.03);
for(Triangle tri: triangles){
tri.display();
}
for(Triangle tri: triangles){
tri.update();
}
if(triangles.get(0).radious > 1500){
triangles.remove(0);
triangles.add(triangles.get(triangles.size() - 1).makeChild());
}
}
class Triangle {
float radious;
boolean isUp;
color c;
Triangle(){
radious = 1500;
isUp = true;
c = color(random(360), 100, 100);
}
Triangle(float radious, boolean isUp){
this.radious = radious;
this.isUp = isUp;
c = color(random(360), 100, 100);
}
Triangle makeChild(){
return new Triangle(radious / 2, !isUp);
}
void update(){
radious += radious / 40;
}
void display(){
fill(c);
noStroke();
beginShape();
for(int i = 0; i < 3; i++){
float ang = i * (TWO_PI / 3.0);
ang += isUp ? -HALF_PI: HALF_PI;
vertex(radious * cos(ang), radious * sin(ang));
}
endShape(CLOSE);
}
}