DotMatrix dots; int i = 0; int j = 0; int span = 50; int variant = 0; int generation = 0; int density = 1; float emitter_x = 0.5; float emitter_y = 0.5; float ageing = 0.005; boolean debug = false; class Dot { PVector pos; PVector velo; PVector emitter; float lifetime = 1.0; float ageing; int dotSize; int variant; color c; Dot (PVector pos, PVector velo, PVector emitter, int initialSize, float ageing, int variant){ this.pos = pos; this.velo = velo; this.emitter = new PVector(emitter.x, emitter.y); this.dotSize = initialSize; this.ageing = ageing; this.variant = variant; c = color(random(255), random(255), random(255)); } void drawDot(){ fill(c , lifetime*255); switch (variant){ case 0: ellipse(pos.x*(emitter.x*lifetime), pos.y*(emitter.y*lifetime), dotSize*lifetime, dotSize*lifetime); break; case 1: ellipse(pos.x*(emitter.x*lifetime), pos.y*(emitter.y/lifetime), dotSize*lifetime, dotSize*lifetime); break; case 2: ellipse(pos.x*(emitter.x/lifetime), pos.y*(emitter.y*lifetime), dotSize*lifetime, dotSize*lifetime); break; default: ellipse(pos.x*(emitter.x/lifetime), pos.y*(emitter.y/lifetime), dotSize*lifetime, dotSize*lifetime); break; } lifetime-=ageing; } boolean isAlive(){ return lifetime > 0; } } class DotMatrix { Dot [][] dots = new Dot[10][10]; int x; int y; DotMatrix(){ for (int i = 0; i < dots.length; i++){ for (int j = 0; j < dots[i].length; j++){ //dots[i][j]= new Dot(new PVector(i*span,j*span), new PVector(0,0),new PVector(emitter_x,emitter_y), span, ageing, variant); } } } void render(){ for (int i = 0; i < dots.length; i++){ for (int j = 0; j < dots[i].length; j++){ if (dots[i][j]!=null){ Dot d = dots[i][j]; d.drawDot(); if (!d.isAlive()){ dots[i][j]=null; } } } } if (generation++ % density == 0){ int rand_x = int(random(dots.length)); int rand_y = int(random(dots.length)); dots[rand_x][rand_y]= new Dot(new PVector(rand_x*span,rand_y*span), new PVector(0,0), new PVector(emitter_x,emitter_y), span, ageing, variant); } } } void setup() { dots = new DotMatrix(); size(1000, 600, P2D); noStroke(); fill(204, 204); background(0); } float rotator = 0.0; void draw() { translate(width/3,height/2); rotate(rotator); rotator += 0.01; background(0); dots.render(); span+= random(-3, 4); if (span < 5){ span=5; }else if (span > 80){ span=80; } } void mouseClicked() { span = int(random(5, 80)); emitter_x = random(0.1, 3.0); emitter_y = random(0.1, 3.0); variant = int(random(0, 4)); ageing = random(0.0005, 0.01); density = int(random(1,5)); if (debug){ println ("emitter_x:"+emitter_x+" emitter_y:"+emitter_y +" variant:"+variant); } }