Fluid particle simulation problem!!
in
Programming Questions
•
2 years ago
Hi, im trying to simulate a 2D fluid particle system width ellipses representing particles, but im having trouble when 2 of the particles collide and one of them is colliding a wall, they kind of go crazy.
I don't know if is the order of checking collitions (first wall-particle, or particle-particle), here is my code...
p.colision();
p.pared();
p.mover();
p.pintar();
class particula
{
PVector pos,vel,fuerza;
float masa;
int id,vecinas[],cont;
color col,cal,cel;
particula[] otros;
int[] vecinos;
particula(int id_)
{
pos = new PVector(random(width/3,2*width/3),height/2);
vel = new PVector(0,0);
fuerza = new PVector(0,G);
masa=1;
col=0;
id=id_;
otros=p;
cont=0;
}
void pintar()
{
fill(100,10,180,30);
noStroke();
ellipse(pos.x,pos.y,r,r);
stroke(int(map(vecinos.length,0,6,0,255)),cal,0);
strokeWeight(r/3);
point(pos.x,pos.y);
}
void mover()
{
fuerza.mult(masa);
vel=new PVector(fuerza.x,fuerza.y);
pos.add(vel);
fuerza = new PVector(0,G);
}
//////////////////////////// Wall collition ///////////////
void pared()
{
if(pos.x>width-r)
{
pos.x=width-r/2;
fuerza.x-=r/2;
}
if(pos.x<r)
{
pos.x=r/2;
fuerza.x+=r/2;
}
if(pos.y<r)
{
pos.y=r/2;
fuerza.y+=r/2;
}
if(pos.y>height-r)
{
pos.y=height-r/2;
fuerza.y-=r/2;
}
}
void pared()
{
if(pos.x>width-r)
{
pos.x=width-r/2;
fuerza.x-=r/2;
}
if(pos.x<r)
{
pos.x=r/2;
fuerza.x+=r/2;
}
if(pos.y<r)
{
pos.y=r/2;
fuerza.y+=r/2;
}
if(pos.y>height-r)
{
pos.y=height-r/2;
fuerza.y-=r/2;
}
}
////////////////// PARTICLE-PARTICLE COLLITION///////////////////////////
void colision()
{
cont=0;
for(int i=0;i<tam;i++)
{
if(i==id)continue;
PVector d = new PVector(otros[i].pos.x,otros[i].pos.y);
d.sub(pos);
if(d.mag()<=r)
cont++;
}
vecinos = new int[cont];
cont=0;
for(int i=0;i<tam;i++)
{
if(i==id)continue;
PVector d = new PVector(otros[i].pos.x,otros[i].pos.y);
d.sub(pos);
float tu=r-d.mag();
if(d.mag()<=r)
{
float angulo = atan2(otros[i].pos.y-pos.y,otros[i].pos.x-pos.x);
fuerza.x-=cos(angulo)*tu;
fuerza.y-=sin(angulo)*tu;
}
}
}
void colision()
{
cont=0;
for(int i=0;i<tam;i++)
{
if(i==id)continue;
PVector d = new PVector(otros[i].pos.x,otros[i].pos.y);
d.sub(pos);
if(d.mag()<=r)
cont++;
}
vecinos = new int[cont];
cont=0;
for(int i=0;i<tam;i++)
{
if(i==id)continue;
PVector d = new PVector(otros[i].pos.x,otros[i].pos.y);
d.sub(pos);
float tu=r-d.mag();
if(d.mag()<=r)
{
float angulo = atan2(otros[i].pos.y-pos.y,otros[i].pos.x-pos.x);
fuerza.x-=cos(angulo)*tu;
fuerza.y-=sin(angulo)*tu;
}
}
}
thanks!!
}
1