for(i=12.5;i<387.5;i+=25*pack){for(j=12.5;j<387.5;j+=25*pack){particles.push(new Particle(i+random(-10,10),j+random(-10,10)))}}
canvas=createGraphics(400,400)
canvas.pixelDensity(0.15)
canvas.background(0);canvas.fill(0,200,255);canvas.stroke(255);canvas.rect(0,0,400,400);canvas.stroke(0,0,0,0)
canvas.pixelDensity(1);canvas.fill(0,200,255);canvas.stroke(255);canvas.rect(0,0,400,400);canvas.stroke(0,0,0,0)
canvas.background(0);canvas.fill(0,0,0,0);canvas.stroke(255);canvas.rect(0,0,400,400);canvas.stroke(0,0,0,0)
for(i=0;i<particles.length;i++){let p=particles[i];p.update();p.show()}
canvas.fill(0,0,0,0);canvas.stroke(255);canvas.rect(0,0,400,400);canvas.stroke(0,0,0,0)
image(canvas,0,0,400,400)
if(keyIsDown(70))console.log(frameRate())
if(key=='a')paused=!paused
if(key=='s')canvas.save('fluid.png')
this.pos=createVector(x,y)
this.vel=createVector(0,0)
if(keyIsDown(32))this.heat=0
for(let i=0;i<particles.length;i++){
if(p.pos.dist(this.pos)<rad){
let s=p.pos.dist(this.pos)
let q=this.pos.copy().sub(p.pos).div(32).mult((s-rad)/s)
this.vel.sub(q);this.pos.sub(q);q.mult(-1)
p.vel.sub(q);p.pos.sub(q)
if(new p5.Vector(mouseX,mouseY).dist(this.pos)<50){
let s=new p5.Vector(mouseX,mouseY).dist(this.pos)
let q=this.pos.copy().sub(mouseX,mouseY).div(64).mult((s-50)/s)
this.vel.sub(q);this.pos.sub(q);q.mult(-1)
let r=noise(frameCount/50)*400
if(new p5.Vector(r,320).dist(this.pos)<50){
let s=new p5.Vector(r,320).dist(this.pos)
let q=this.pos.copy().sub(r,320).div(64).mult((s-50)/s)
this.vel.sub(q);this.pos.sub(q);q.mult(-1)
if(this.pos.x<12.5){this.pos.x=12.5;this.vel.x=this.vel.x/2}
if(this.pos.x>400-12.5){this.pos.x=400-12.5;this.vel.x=this.vel.x/2}
if(this.pos.y>400-12.5){this.pos.y=400-12.5;this.vel.y=this.vel.y/2}
canvas.fill(0,200,255,100)
canvas.circle(this.pos.x,this.pos.y,10)